如何将标准UUID转换为蓝牙栈BT_UUID_INIT_128所需的十六进制数组
问题解答
1. 数组格式说明
你给出的0x6d, 0x1b...序列确实是十六进制格式的单字节值,0x是C语言中十六进制数值的标准前缀,每个元素对应一个8位无符号字节。
2. 转换逻辑说明
这个转换核心是大小端序反转,原因是你用到的BT_UUID_INIT_128是Zephyr蓝牙栈的宏,要求输入小端序的128位UUID字节序列,而标准UUID字符串的书写顺序是大端序,转换步骤如下:
- 第一步:删除标准UUID字符串中的所有短横线
-,得到32位连续的十六进制字符串 - 第二步:将32位字符串按每2个字符为一组,拆分得到16个十六进制字节,此时得到的是UUID的大端序字节序列
- 第三步:将16字节的大端序列整体反转,得到的就是
BT_UUID_INIT_128要求的输入顺序
以你给出的UUID为例:
标准UUID:65210001-28D5-4B7B-BADF-7DEE1E8D1B6D
删除横杠后:6521000128D54B7BBADF7DEE1E8D1B6D
大端字节序列:[0x65, 0x21, 0x00, 0x01, 0x28, 0xD5, 0x4B, 0x7B, 0xBA, 0xDF, 0x7D, 0xEE, 0x1E, 0x8D, 0x1B, 0x6D]
反转后得到的小端序列:[0x6d, 0x1b, 0x8d, 0x1e, 0xee, 0x7d, 0xdf, 0xba, 0x7b, 0x4b, 0xd5, 0x28, 0x01, 0x00, 0x21, 0x65],和示例中的参数完全一致。
3. Python实现方案
推荐使用Python内置的uuid模块实现,逻辑简单且不易出错:
import uuid def convert_uuid_to_bt_params(uuid_str: str) -> tuple[list[int], str]: """ 输入标准UUID字符串,返回小端序字节列表,以及可直接用于C代码的格式化字符串 """ # 解析标准UUID parsed_uuid = uuid.UUID(uuid_str) # bytes_le属性直接返回小端序字节序列 little_endian_bytes = list(parsed_uuid.bytes_le) # 生成C代码格式的参数 c_format_str = ", ".join([f"0x{b:02x}" for b in little_endian_bytes]) return little_endian_bytes, c_format_str # 测试 if __name__ == "__main__": test_uuid = "65210001-28D5-4B7B-BADF-7DEE1E8D1B6D" byte_list, c_params = convert_uuid_to_bt_params(test_uuid) print("小端序字节列表:", byte_list) print("C代码格式化参数:", f"BT_UUID_INIT_128({c_params})")
如果不想依赖uuid模块,也可以手动拆分反转实现:
def convert_uuid_manual(uuid_str: str) -> tuple[list[int], str]: clean_uuid = uuid_str.replace("-", "") # 拆分得到大端序字节列表 big_endian = [int(clean_uuid[i:i+2], 16) for i in range(0, 32, 2)] # 反转得到小端序 little_endian = big_endian[::-1] c_format_str = ", ".join([f"0x{b:02x}" for b in little_endian]) return little_endian, c_format_str
运行上述代码输出的C参数和你给出的示例完全一致,可直接使用。
内容的提问来源于stack exchange,提问作者exile97
相关产品推荐
相关产品推荐

