App Inventor 2 数值转换教程
本教程讲解App Inventor 2中各种数值转换方法,包括浮点数与字节互转、进制转换、十六进制操作等。
一、进制转换基础
1.1 常用进制
| 进制 | 基数 | 示例 | App Inventor支持 |
|---|---|---|---|
| 十进制 | 10 | 255 | ✅ 原生 |
| 十六进制 | 16 | 0xFF | ❌ 需转换 |
| 二进制 | 2 | 0b11111111 | ❌ 需转换 |
| 八进制 | 8 | 0377 | ❌ 需转换 |
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
- MIT App Inventor Community - MIT App Inventor Community
- MIT App Inventor GitHub - MIT CML
版权声明
本文档基于 MIT App Inventor 官方文档及社区资源整理,版权归原作者所有:- MIT App Inventor 官方文档采用 CC BY-SA 4.0 授权
- MIT App Inventor Community 帖子版权归原作者所有
