Python十进制转十六进制再转字节报错求助:TypeError问题
解决十进制转字节的报错问题
我来帮你理清这个问题的根源,以及给出简单的解决方案:
问题出在哪?
你之前的错误在于,hex(equipmentID)返回的是十六进制格式的字符串(比如十进制5会得到"0x5"),而bytes()函数如果传入字符串参数,必须指定编码(比如utf-8)——这也是你看到TypeError: string argument without an encoding的原因。更关键的是,就算你加了编码,得到的也不是你想要的字节值(比如bytes("0x5", encoding='utf-8')会得到b'0x5',这是文本字节,不是数值对应的字节)。
正确的转换方法
其实你完全不需要先转成十六进制字符串,直接把十进制整数转成字节就可以了,有两种常用方式:
1. 单字节数值(0-255)直接用bytes([整数])
这和你手动写bytes([0x5])是一个逻辑,因为0x5本身就是十进制5的十六进制写法,本质都是整数:
equipmentID = 5 # 直接将十进制整数转为对应的字节 equipmentID_bytes = bytes([equipmentID]) print(equipmentID_bytes) # 输出: b'\x05'
2. 多字节数值(超过255)用int.to_bytes()方法
如果你的设备ID是更大的数,需要占用多个字节,可以用整数的to_bytes()方法,指定字节数和字节序(大端/小端):
# 比如十进制258,对应十六进制0x0102 equipmentID = 258 # 转成2字节,大端序(高位字节在前) equipmentID_bytes_big = equipmentID.to_bytes(2, byteorder='big') print(equipmentID_bytes_big) # 输出: b'\x01\x02' # 转成2字节,小端序(低位字节在前) equipmentID_bytes_little = equipmentID.to_bytes(2, byteorder='little') print(equipmentID_bytes_little) # 输出: b'\x02\x01'
额外说明
如果非要从十六进制字符串转字节(比如你已经有了"0x5"这样的字符串),可以先把它转回整数,再转字节:
hex_str = "0x5" # 去掉前缀转整数,或者直接用int(hex_str, 16) dec_num = int(hex_str.lstrip('0x'), 16) equipmentID_bytes = bytes([dec_num])
内容的提问来源于stack exchange,提问作者chink
相关产品推荐
相关产品推荐

