将十六进制转换为浮点数
如何在Python中将以下十六进制字符串转换为浮点数(单精度32位)?
"41973333" -> 1.88999996185302734375E1
"41995C29" -> 1.91700000762939453125E1
"470FC614" -> 3.6806078125E4
How to convert the following hex string to float (single precision 32-bit) in Python?
"41973333" -> 1.88999996185302734375E1
"41995C29" -> 1.91700000762939453125E1
"470FC614" -> 3.6806078125E4
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(6)
在Python 3中:
在Python 2中:
In Python 3:
In Python 2:
我建议使用 ctypes 模块,它基本上可以让您使用低级数据类型。在您的情况下,您可以说
我相信 ctypes 模块在这里有意义,因为您本质上是在问如何执行低级位转换。你的问题基本上是,我如何告诉Python获取一些数据并解释该数据,就好像这些完全相同的位是不同的数据类型一样?
在 C 中,如果你有一个 int 并想将其位解释为浮点数,你会做大致相同的事情,获取一个指针,然后对其进行转换和取消引用:
这正是使用
ctypes< 的 Python 代码。 /code> 库在我的示例中正在执行。
I recommend using the ctypes module which basically lets you work with low level data types. In your case you could say
I believe that the
ctypes
module makes sense here, because you're essentially asking how to perform low-level bit casting. Your question is basically, how do I tell Python to take some data and interpret that data as if those exact same bits were a different data type?In C if you had an int and wanted to interpret its bits as a float, you'd do roughly the same thing, taking a pointer and then casting and dereferencing it:
and that's exactly what the Python code using the
ctypes
library is doing in my example.我猜这个问题与 this one 有关,并且您正在使用 4 个字节而不是 8 个字节十六进制数字。
"\x41\x91\x33\x33"
是一个 4 字节字符串,即使它看起来像 16如果您确实需要处理十六进制数字字符串而不是实际字节,您可以使用
struct.pack
来转换它,就像这样I'm guessing this question relates to this one and you are working with 4 bytes rather than 8 hex digits.
"\x41\x91\x33\x33"
is a 4 byte string even though it looks like 16If you do need to deal with the string of hexdigits rather than the actual bytes, you can use
struct.pack
to convert it, like this将十六进制字符串切成 2 个字符的块(字节),使用 int 格式将每个块转换为正确的字节,完成后进行 struct.unpack。即:
根据需要发射:
Slice up the hex strings into 2-character chunks (bytes), make each chunk into the right byte with int formatting, struct.unpack when done. I.e.:
emitting, as desired:
当使用字符串时,无需对值进行切片或索引。
When working from string and without having to slice or index values.
先生们...看哪:
抱歉最后的小“.value”...
这段代码已经在我的程序中用作类近两年了。
(只需稍加编辑,您就可以轻松地将其变成一个函数)
代码归功于 DaniWeb 上的 PyTony。
与非动态计算不同,
代码没有硬连接到固定的浮动大小,
并适用于任何字节大小。
尽管我想我们仍然有一些错误需要解决。 XDD
(我稍后会(如果可以的话)通过更新编辑此代码)
不过现在一切都很好......
我用它转换 3D 游戏模型没有遇到任何问题。 :)
Gentelmen... Behold:
sorry for the little ".value" at the end...
this code has been used as a class in my program for nearly 2 years now.
(with a little editing, you can easily make it into a function)
credit to PyTony over at DaniWeb for the code.
unlike non-dynamic computing,
the code is not hard-wired to a fixed float size,
and works with any byte-size.
though I guess we still have a few bugs to work out. XDD
(I'll edit this code later (if I can) with the update)
all is good though for now though...
I havn't had a problem converting 3D game models with it. :)