App Inventor 2 数值转换教程

本教程讲解App Inventor 2中各种数值转换方法,包括浮点数与字节互转、进制转换、十六进制操作等。

一、进制转换基础

1.1 常用进制

进制基数示例App Inventor支持
十进制10255✅ 原生
十六进制160xFF❌ 需转换
二进制20b11111111❌ 需转换
八进制80377❌ 需转换

1.2 十进制转其他进制

过程 十进制转十六进制(数值)
  设置 全局变量 商 = 数值
  设置 全局变量 余数列表 = 创建空列表()
  
  循环当 全局变量 商 > 0
    设置 全局变量 余数 = 全局变量 商 mod 16
    添加项目到列表(全局变量 余数列表, 全局变量 余数)
    设置 全局变量 商 = 向下取整(全局变量 商 / 16)
  循环结束
  
  // 转换为十六进制字符
  设置 全局变量 结果 = ""
  对于 i 从 获取列表长度(全局变量 余数列表) 到 1 步长 -1
    设置 全局变量 余 = 获取列表项目(全局变量 余数列表, i)
    设置 全局变量 字符 = 选择(全局变量 余数 < 10, "" + 全局变量 余, 文本字符(65 + 全局变量 余 - 10))
    设置 全局变量 结果 = 全局变量 结果 + 全局变量 字符
  循环结束
  
  返回 "0x" + 全局变量 结果
过程结束

过程 十进制转二进制(数值)
  设置 全局变量 商 = 数值
  设置 全局变量 余数列表 = 创建空列表()
  
  循环当 全局变量 商 > 0
    设置 全局变量 余数 = 全局变量 商 mod 2
    添加项目到列表(全局变量 余数列表, 全局变量 余数)
    设置 全局变量 商 = 向下取整(全局变量 商 / 2)
  循环结束
  
  // 反转并连接
  设置 全局变量 结果 = ""
  对于 i 从 获取列表长度(全局变量 余数列表) 到 1 步长 -1
    设置 全局变量 结果 = 全局变量 结果 + 获取列表项目(全局变量 余数列表, i)
  循环结束
  
  返回 全局变量 结果
过程结束

1.3 其他进制转十进制

过程 十六进制转十进制(十六进制文本)
  // 移除0x前缀
  设置 全局变量 文本 = 文本替换(十六进制文本, "0x", "")
  设置 全局变量 文本 = 文本替换(全局变量 文本, "0X", "")
  
  设置 全局变量 结果 = 0
  设置 全局变量 长度 = 文本长度(全局变量 文本)
  
  对于 i 从 1 到 全局变量 长度
    设置 全局变量 字符 = 文本取部分(全局变量 文本, i, 1)
    设置 全局变量 位值 = 选择(文本是数字(全局变量 字符), 文本转数字(全局变量 字符), 文本转数字(文本字符(文本字符码(全局变量 字符) - 55)))
    设置 全局变量 结果 = 全局变量 结果 + 全局变量 位值 * (16 ^ (全局变量 长度 - i))
  循环结束
  
  返回 全局变量 结果
过程结束

过程 二进制转十进制(二进制文本)
  设置 全局变量 结果 = 0
  设置 全局变量 长度 = 文本长度(二进制文本)
  
  对于 i 从 1 到 全局变量 长度
    设置 全局变量 位 = 文本取部分(二进制文本, i, 1)
    设置 全局变量 位值 = 文本转数字(全局变量 位)
    设置 全局变量 结果 = 全局变量 结果 + 全局变量 位值 * (2 ^ (全局变量 长度 - i))
  循环结束
  
  返回 全局变量 结果
过程结束

二、浮点数与字节互转

2.1 IEEE 754浮点数格式

32位单精度浮点数结构:
┌─────────────────────────────────────┐
│ S │    E    │         M             │
│ 1 │  8位    │      23位             │
└─────────────────────────────────────┘
S: 符号位(0正1负)
E: 指数位(偏移127)
M: 尾数位(隐藏1)

2.2 浮点数转字节数组

过程 浮点数转四字节(数值)
  // 步骤1: 分离符号、指数、尾数
  设置 全局变量 符号 = 选择(数值 < 0, 1, 0)
  设置 全局变量 绝对值 = 绝对值(数值)
  
  // 步骤2: 计算指数
  设置 全局变量 指数 = 向下取整(对数(全局变量 绝对值) / 对数(2))
  设置 全局变量 偏移指数 = 全局变量 指数 + 127
  
  // 步骤3: 计算尾数
  设置 全局变量 尾数 = 全局变量 绝对值 / (2 ^ 全局变量 指数) - 1
  
  // 步骤4: 转换为32位整数
  设置 全局变量 位模式 = 0
  设置 全局变量 位模式 = 全局变量 符号 * 2147483648  // 31位
  设置 全局变量 位模式 = 全局变量 位模式 + 全局变量 偏移指数 * 8388608  // 23-30位
  设置 全局变量 位模式 = 全局变量 位模式 + 向下取整(全局变量 尾数 * 8388608)  // 0-22位
  
  // 步骤5: 拆分为4个字节
  设置 全局变量 字节1 = 向下取整(全局变量 位模式 / 16777216) mod 256
  设置 全局变量 字节2 = 向下取整(全局变量 位模式 / 65536) mod 256
  设置 全局变量 字节3 = 向下取整(全局变量 位模式 / 256) mod 256
  设置 全局变量 字节4 = 全局变量 位模式 mod 256
  
  返回 [全局变量 字节1, 全局变量 字节2, 全局变量 字节3, 全局变量 字节4]
过程结束

2.3 字节数组转浮点数

过程 四字节转浮点数(字节数组)
  // 重组32位整数
  设置 全局变量 位模式 = 
    获取列表项目(字节数组, 1) * 16777216 +
    获取列表项目(字节数组, 2) * 65536 +
    获取列表项目(字节数组, 3) * 256 +
    获取列表项目(字节数组, 4)
  
  // 提取各部分
  设置 全局变量 符号 = 向下取整(全局变量 位模式 / 2147483648)
  设置 全局变量 偏移指数 = (全局变量 位模式 mod 2147483648) / 8388608
  设置 全局变量 尾数 = (全局变量 位模式 mod 8388608) / 8388608
  
  // 计算值
  设置 全局变量 指数 = 全局变量 偏移指数 - 127
  设置 全局变量 尾数值 = 1 + 全局变量 尾数
  设置 全局变量 结果 = 全局变量 尾数值 * (2 ^ 全局变量 指数)
  
  // 应用符号
  如果 全局变量 符号 = 1 则
    设置 全局变量 结果 = -1 * 全局变量 结果
  如果结束
  
  返回 全局变量 结果
过程结束

三、整数与字节互转

3.1 16位整数转2字节

过程 整数转双字节(数值)
  // 大端序(高位在前)
  设置 全局变量 高位 = 向下取整(数值 / 256)
  设置 全局变量 低位 = 数值 mod 256
  
  返回 [全局变量 高位, 全局变量 低位]
过程结束

过程 双字节转整数(高字节, 低字节)
  返回 高字节 * 256 + 低字节
过程结束

3.2 32位整数转4字节

过程 整数转四字节(数值)
  设置 全局变量 字节1 = 向下取整(数值 / 16777216) mod 256
  设置 全局变量 字节2 = 向下取整(数值 / 65536) mod 256
  设置 全局变量 字节3 = 向下取整(数值 / 256) mod 256
  设置 全局变量 字节4 = 数值 mod 256
  
  返回 [全局变量 字节1, 全局变量 字节2, 全局变量 字节3, 全局变量 字节4]
过程结束

过程 四字节转整数(字节1, 字节2, 字节3, 字节4)
  返回 字节1 * 16777216 + 字节2 * 65536 + 字节3 * 256 + 字节4
过程结束

四、实用案例:串口数据解析

4.1 解析GPS NMEA协议

过程 解析GPRMC(数据)
  // $GPRMC,123519,A,4807.038,N,01131.000,E,022.4,084.4,230394,020.3,E*68
  
  设置 全局变量 部分列表 = 文本分割(数据, ",")
  
  // 提取时间
  设置 全局变量 时间文本 = 获取列表项目(全局变量 部分列表, 2)
  如果 全局变量 时间文本 ≠ "" 则
    设置 全局变量 时 = 文本取部分(全局变量 时间文本, 1, 2)
    设置 全局变量 分 = 文本取部分(全局变量 时间文本, 3, 4)
    设置 全局变量 秒 = 文本取部分(全局变量 时间文本, 5, 6)
    设置 Label_Time.文本 = 全局变量 时 + ":" + 全局变量 分 + ":" + 全局变量 秒
  如果结束
  
  // 提取纬度
  设置 全局变量 纬度文本 = 获取列表项目(全局变量 部分列表, 4)
  设置 全局变量 北南 = 获取列表项目(全局变量 部分列表, 5)
  如果 全局变量 纬度文本 ≠ "" 则
    设置 全局变量 度 = 文本取部分(全局变量 纬度文本, 1, 2)
    设置 全局变量 分 = 文本取部分(全局变量 纬度文本, 3, -1)
    设置 全局变量 纬度 = 文本转数字(全局变量 度) + 文本转数字(全局变量 分) / 60
    如果 全局变量 北南 = "S" 则
      设置 全局变量 纬度 = -1 * 全局变量 纬度
    如果结束
    设置 Label_Lat.文本 = "纬度: " + 四舍五入(全局变量 纬度, 6)
  如果结束
  
  // 提取经度
  设置 全局变量 经度文本 = 获取列表项目(全局变量 部分列表, 6)
  设置 全局变量 东西 = 获取列表项目(全局变量 部分列表, 7)
  如果 全局变量 经度文本 ≠ "" 则
    设置 全局变量 度 = 文本取部分(全局变量 经度文本, 1, 3)
    设置 全局变量 分 = 文本取部分(全局变量 经度文本, 4, -1)
    设置 全局变量 经度 = 文本转数字(全局变量 度) + 文本转数字(全局变量 分) / 60
    如果 全局变量 东西 = "W" 则
      设置 全局变量 经度 = -1 * 全局变量 经度
    如果结束
    设置 Label_Lon.文本 = "经度: " + 四舍五入(全局变量 经度, 6)
  如果结束
过程结束

4.2 解析Modbus寄存器数据

过程 解析Modbus浮点数(高寄存器, 低寄存器)
  // 将两个16位寄存器转为32位整数
  设置 全局变量 位模式 = 高寄存器 * 65536 + 低寄存器
  
  // 按IEEE 754解析(假设寄存器已按正确顺序存储)
  设置 全局变量 符号 = 向下取整(位模式 / 2147483648)
  设置 全局变量 指数 = (位模式 / 8388608) mod 256
  设置 全局变量 尾数 = (位模式 mod 8388608) / 8388608
  
  如果 全局变量 指数 = 0 且 全局变量 尾数 = 0 则
    返回 0
  如果结束
  
  设置 全局变量 浮点值 = (1 + 全局变量 尾数) * (2 ^ (全局变量 指数 - 127))
  
  如果 全局变量 符号 = 1 则
    设置 全局变量 浮点值 = -1 * 全局变量 浮点值
  如果结束
  
  返回 全局变量 浮点值
过程结束

五、BCD码转换

5.1 十进制转BCD

过程 十进制转BCD(数值)
  设置 全局变量 高位 = 向下取整(数值 / 10)
  设置 全局变量 低位 = 数值 mod 10
  
  返回 高位 * 16 + 低位
过程结束

过程 BCD转十进制(BCD值)
  设置 全局变量 高位 = 向下取整(BCD值 / 16)
  设置 全局变量 低位 = BCD值 mod 16
  
  返回 高位 * 10 + 低位
过程结束

5.2 时间BCD转换

过程 时间文本转BCD(时间)
  // 输入格式: "HH:MM:SS"
  设置 全局变量 部分 = 文本分割(时间, ":")
  
  设置 全局变量 时BCD = 调用 十进制转BCD(文本转数字(获取列表项目(全局变量 部分, 1)))
  设置 全局变量 分BCD = 调用 十进制转BCD(文本转数字(获取列表项目(全局变量 部分, 2)))
  设置 全局变量 秒BCD = 调用 十进制转BCD(文本转数字(获取列表项目(全局变量 部分, 3)))
  
  返回 [全局变量 时BCD, 全局变量 分BCD, 全局变量 秒BCD]
过程结束

六、字符串与字节互转

6.1 字符串转十六进制

过程 字符串转十六进制(文本)
  设置 全局变量 结果 = ""
  
  对于 i 从 1 到 文本长度(文本)
    设置 全局变量 字符 = 文本取部分(文本, i, 1)
    设置 全局变量 字符码 = 文本字符码(全局变量 字符)
    设置 全局变量 结果 = 全局变量 结果 + 调用 十进制转十六进制(全局变量 字符码) + " "
  循环结束
  
  返回 文本修剪(全局变量 结果)
过程结束

过程 十六进制转字符串(十六进制文本)
  设置 全局变量 字节文本 = 文本替换(十六进制文本, "0x", "")
  设置 全局变量 字节文本 = 文本替换(全局变量 字节文本, " ", "")
  设置 全局变量 结果 = ""
  
  对于 i 从 1 到 文本长度(全局变量 字节文本) 步长 2
    设置 全局变量 字节文本段 = 文本取部分(全局变量 字节文本, i, i + 1)
    设置 全局变量 字节值 = 调用 十六进制转十进制(全局变量 字节文本段)
    设置 全局变量 结果 = 全局变量 结果 + 文本字符(全局变量 字节值)
  循环结束
  
  返回 全局变量 结果
过程结束

七、常用工具函数

初始化全局变量 HEX字符 = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F"]

过程 字节转十六进制字符串(字节值)
  设置 全局变量 高位 = 向下取整(字节值 / 16)
  设置 全局变量 低位 = 字节值 mod 16
  返回 获取列表项目(全局变量 HEX字符, 全局变量 高位 + 1) + 获取列表项目(全局变量 HEX字符, 全局变量 低位 + 1)
过程结束

过程 字节数组转十六进制字符串(字节数组)
  设置 全局变量 结果 = ""
  对于 每个 字节 在 字节数组 中
    设置 全局变量 结果 = 全局变量 结果 + 调用 字节转十六进制字符串(字节) + " "
  循环结束
  返回 文本修剪(全局变量 结果)
过程结束

过程 格式化显示数值(数值, 小数位数)
  设置 全局变量 乘数 = 10 ^ 小数位数
  设置 全局变量 四舍五入值 = 四舍五入(数值 * 全局变量 乘数)
  返回 四舍五入值 / 全局变量 乘数
过程结束

八、常见问题

8.1 大小端问题

问题:不同设备字节顺序不同
解决:需要交换字节顺序
过程 交换字节顺序(字节数组)
  如果 获取列表长度(字节数组) = 4 则
    返回 [获取列表项目(字节数组, 4), 获取列表项目(字节数组, 3), 获取列表项目(字节数组, 2), 获取列表项目(字节数组, 1)]
  否则 如果 获取列表长度(字节数组) = 2 则
    返回 [获取列表项目(字节数组, 2), 获取列表项目(字节数组, 1)]
  否则
    返回 字节数组
  如果结束
过程结束

8.2 精度丢失

问题:浮点数转换可能有误差
解决:保留足够的小数位数

8.3 负数处理

问题:负数二进制表示特殊
解决:使用补码方式处理

九、总结

转换类型方法应用场景
十进制↔十六进制除法取余调试显示
浮点数↔四字节IEEE 754传感器数据
整数↔多字节乘法/除法串口通信
字符串↔十六进制字符码协议解析
BCD码转换位运算时钟显示

教程作者:ai2claw 🐝
创建时间:2026-03-30
适用版本:App Inventor 2

参考资料与版权声明

原文来源

版权声明

本文档基于 MIT App Inventor 官方文档及社区资源整理,版权归原作者所有:
  • MIT App Inventor 官方文档采用 CC BY-SA 4.0 授权
  • MIT App Inventor Community 帖子版权归原作者所有
本文档由 ai2claw 🐝 整理,仅供学习参考,如有侵权请联系删除。