Python中长字节如何表示?转换时最高位为何看似丢失?
关于Python十六进制转字节的疑问解答
为什么看起来0x64没被转换为字节?
这是Python对bytes对象的显示方式造成的误解。b'd\x1b\xea\xc6'里的'd'就是0x64对应的ASCII字符——0x64的十进制值是100,正好是小写字母d的ASCII码。Python打印bytes对象时,会把可打印的ASCII字符(范围0x20-0x7E)直接显示为字符,不可打印的才用\xXX的十六进制转义格式。
你可以用以下代码验证:
byte_data = b'd\x1b\xea\xc6' print(byte_data[0]) # 输出100,即0x64的十进制值 print(hex(byte_data[0])) # 输出0x64,确认这就是目标十六进制值
如何表示任意长十六进制值并将其视为字节?
有三种可靠的方法:
- 直接使用
bytes.fromhex():传入纯十六进制字符串(大小写均可),自动转换为对应字节,支持任意长度:# 转换4字节十六进制 bytes.fromhex("641BEAC6") # 得到b'd\x1b\xea\xc6' # 转换更长的十六进制串 bytes.fromhex("123456789ABCDEF01A") # 得到b'\x124Vx\x9a\xbc\xde\xf0\x1a' - 整数转字节时动态计算长度:如果十六进制值是整数形式,可通过位长计算所需字节数,避免手动指定长度出错:
hex_int = 0x641BEAC6 # 计算字节数:(位长 +7) //8 实现向上取整 byte_length = (hex_int.bit_length() + 7) // 8 hex_int.to_bytes(byte_length, 'big') # 得到b'd\x1b\xea\xc6' - 使用
binascii.unhexlify():和bytes.fromhex()功能一致,适合已导入binascii模块的场景:import binascii binascii.unhexlify("641BEAC6") # 得到b'd\x1b\xea\xc6'
内容的提问来源于stack exchange,提问作者SomeGuy
相关产品推荐
相关产品推荐

