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等函数实现主机字节序和网络字节序相互转换

python实现全角半角的相互转换

Python中int类型和string类型的相互转换

python IP地址十六进制二进制间相互转换

Python网络编程——主机字节序和网络字节序之间的相互转换

Python二十八进制相互转换