|
|
问题描述用户在文本框输入"ABCD",想通过蓝牙发送 0xAB 0xCD 两个字节,而不是四个ASCII字符(0x41 0x42 0x43 0x44)。
每两个字符代表一个十六进制字节,需要将字符对解析为实际的字节值。
问题本质| 输入 | 期望发送 | 实际发送(当前问题) | | "ABCD" | [0xAB, 0xCD](2字节) | [0x41, 0x42, 0x43, 0x44](4字节ASCII) | 解决方案核心思路:遍历字符串,每两个字符一组,分别解析高位和低位,组合成一个字节值,最后用 WriteBytes 发送。
1. HexCharToValue 辅助过程将单个十六进制字符(0-9, A-F, a-f)转换为对应的数值:
- "0"~"9" → 0~9
- "A"~"F" → 10~15
- "a"~"f" → 10~15
实现方法:通过比较 ASCII 码来判断字符范围,然后做减法运算。
2. HexTextToBytes 主转换过程伪代码逻辑:
过程 HexTextToBytes(hexText) 输入: hexText = "ABCD" 输出: 字节列表 [171, 205] 即 [0xAB, 0xCD] 清空字节列表 设置 i = 1 当 i < hexText的长度 时执行: 取高位字符 = hexText的子串(i, 1) 如 "A" 取低位字符 = hexText的子串(i+1, 1) 如 "B" 高位值 = HexCharToValue(高位字符) A→10 低位值 = HexCharToValue(低位字符) B→11 字节值 = 高位值 × 16 + 低位值 10×16+11 = 171 = 0xAB 将字节值添加到字节列表 i = i + 2 返回字节列表3. 蓝牙发送使用 BluetoothLE1.WriteBytes(serviceUuid, charUuid, signed=false, 字节列表) 直接发送转换后的数字列表。
WriteBytes 接收的列表里每个元素是数字(0-255),会自动转成对应字节。
关键注意事项- 输入校验:字符串长度必须是偶数,只包含 0-9、A-F、a-f
- 大小写兼容:A-F 和 a-f 都要支持
- 空格处理:用户可能输入 "AB CD",发送前需去除空格
- 字节范围:每对字符解析后值范围是 0-255,正好一个字节
验证示例| 输入字符串 | 解析过程 | 发送字节 | | "ABCD" | AB→171, CD→205 | [171, 205] | | "FF00" | FF→255, 00→0 | [255, 0] | | "1A2B" | 1A→26, 2B→43 | [26, 43] | | "0AFF" | 0A→10, FF→255 | [10, 255] | 总结这个方案的核心就是:把用户输入的十六进制字符串,每两个字符一组,转成对应的数字字节值,再通过 WriteBytes 发送。整个过程用两个过程块即可实现,代码清晰且通用。
如有疑问欢迎回帖讨论!
|
|