Python 3.8:将8字节序列转换为4个十六进制值的列表
解决方案
你的核心问题是没搞清楚:输入的b'12345678'里每个字节是字符的ASCII码值(比如b'1'对应49,即0x31),但你需要的是把两个字符当成十六进制的两位数字来组合。直接操作字节的ASCII值肯定得不到正确结果,正确的处理步骤如下:
实现代码
def ConvertToHexAndSend(serialnumber): # 将bytes转成ASCII字符串(输入是固定长度8的字符bytes,解码不会出错) str_serial = serialnumber.decode('ascii') # 每两个字符分割成一组 hex_groups = [str_serial[i:i+2] for i in range(0, 8, 2)] # 把每组字符串转成十六进制整数 return [int(group, 16) for group in hex_groups]
测试验证
serialnumber = b'12345678' print(ConvertToHexAndSend(serialnumber)) # 输出 [18, 52, 86, 120] # 注:Python中整数18和0x12是同一个值,只是显示形式不同,若要以十六进制格式查看,可这样打印: print([hex(num) for num in ConvertToHexAndSend(serialnumber)]) # 输出 ['0x12', '0x34', '0x56', '0x78']
你的尝试为什么错了
list(serialnumber)得到的是每个字符的ASCII码值(比如b'1'对应49),你用new_list[0] << 8 + new_list[1]是对ASCII码值做位运算,完全和目标无关,自然得到异常值。hex(serialnumber[0])返回的是ASCII码值的十六进制字符串(比如b'1'的ASCII是49,所以得到'0x31'),不是字符本身对应的十六进制数字。serialnumber[0] + serialnumber[1]是把两个ASCII码值相加(49+50=99),同样和目标逻辑不沾边。
内容的提问来源于stack exchange,提问作者EmbeddedNoob
相关产品推荐
相关产品推荐

