Python十六进制字节相互转换奇怪
Posted
技术标签:
【中文标题】Python十六进制字节相互转换奇怪【英文标题】:Python hexidecimal byte interconversion oddity 【发布时间】:2022-01-18 03:08:46 【问题描述】:我一定是错过了什么......
np.float32(0xc32).tobytes() # --> `b'\x00 CE'`
struct.pack('<f', 0xc32) # --> `b'\x00 CE'`
但以下内容不会转换回来...
np.float32(0xc32).tobytes().hex() # --> '00204345'
struct.pack('<f', 0xc32).hex() # --> '00204345'
有人知道这里的错误吗?
【问题讨论】:
您期待的是什么?转换回到什么? 错误是使用hex()
,它做了一些与你想要的不同的事情。
@juanpa.arrivillaga 希望从十六进制字符串0xc32
转换回0xc32
您是否尝试过使用struct.unpack
作为struct.pack
的倒数?
0xc32
不是“十六进制字符串”。它是一个 int
文字,其计算结果是一个常规的 int
对象,事实上,这是使用十六进制符号在源代码中编写的,这并不是 int
对象真正知道的。
【参考方案1】:
正如 cmets 中所指出的,我的错误是关于十六进制字符串的假设......进行这种相互转换的正确方法:
np.frombuffer(np.float32(0xc32).tobytes(), dtype=np.float32)
struct.unpack('<f',struct.pack('<f', 0xc32))
【讨论】:
【参考方案2】:那里的问题是因为那是那个值的十六进制字符串。当您将其转换为浮点数时,这就是该浮点值的十六进制表示。
【讨论】:
以上是关于Python十六进制字节相互转换奇怪的主要内容,如果未能解决你的问题,请参考以下文章
python通过ntohl和htonl等函数实现主机字节序和网络字节序相互转换