G.R*_*sky 3 python hex python-3.x
请注意,问题不是十六进制到十进制,而是十六进制值到整数的字符串.
假设我有一个来自hexdump的刺痛(例如'6c 02 00 00')所以我需要先将其转换为实际的十六进制,然后获得它所代表的整数...(这个特定的一个将是620作为一个int16和int32)
我尝试了很多东西,但更多地迷惑了自己.有没有快速的方法在python中进行这样的转换(最好是3.x)?
您可以使用unhexlify()将十六进制字符串转换为其二进制形式,然后使用将小端struct.unpack()值解码为 int:
>>> from struct import unpack
>>> from binascii import unhexlify
>>> n = unpack('<i', unhexlify('6c 02 00 00'.replace(' ','')))[0]
>>> n
Run Code Online (Sandbox Code Playgroud)
格式字符串 '<i'表示小端有符号整数。您可以用'<I'或替换'<L'unsigned int 或 long(均为 4 个字节)。
如果数据不包含空格,则简化为
>>> n = unpack('<i', unhexlify('6c020000'))[0]
Run Code Online (Sandbox Code Playgroud)
不仅是一个字符串,而且它是以小端顺序 - 只是删除空格,并使用int(xx, 16)调用将工作.它也没有实际的字节值作为4个任意0-255数字(在这种情况下struct.unpack可以工作).
我认为一个很好的方法是将组件交换回"人类可读"的顺序,并使用int调用 - 因此:
number = int("".join("6c 02 00 00".split()[::-1]), 16)
Run Code Online (Sandbox Code Playgroud)
那里发生了什么:第一部分是split- 它在空格处打破了字符串,并提供了一个包含四个字符串的列表,每个字符串有两个数字.接下来是[:: - 1]特殊切片 - 它大致意味着"从前一个序列中提供元素的子集,从边缘开始,一次返回1个元素" - 这是一个常见的Python习惯用法任何序列.
这个反向序列用于调用"".join(...)- 它基本上使用空字符串作为序列中每个元素的连接符 - 该调用的结果是"0000026c".使用此值,我们只调用Python的int类,该类接受辅助可选参数,表示应该用于解释第一个参数中表示的数字的基数.
>>> int("".join("6c 02 00 00".split()[::-1]), 16)
620
Run Code Online (Sandbox Code Playgroud)
另一种选择是累计添加每2位数的转换,根据它们的位置适当地移动到它们的权重 - 这也可以在单个表达式中使用reduce,尽管4行Python for循环将更具可读性:
>>> from functools import reduce #not needed in Python2.x
>>> reduce(lambda x, y: x + (int(y[1], 16)<<(8 * y[0]) ), enumerate("6c 02 00 00".split()), 0)
620
Run Code Online (Sandbox Code Playgroud)
更新 OP只是说他实际上并没有字符串中的"空格" - 在这种情况下,人们可以使用相同的方法abotu,但取两个数字而不是split()调用:
reduce(lambda x, y: x + (int(y[1], 16)<<(8 * y[0]//2) ), ((i, a[i:i+2]) for i in range(0, len(a), 2)) , 0)
Run Code Online (Sandbox Code Playgroud)
(a当然,变量带有你的数字) - 或者,将它转换为内存中实际的4字节数,使用十六进制编解码器,并用结构解包数字 - 这对于你的代码来说可能更加语义正确:
import codecs
import struct
struct.unpack("<I", codecs.decode("6c020000", "hex") )[0]
Run Code Online (Sandbox Code Playgroud)
所以这里的方法是将每个2位数传递给内存中由codecs.decode调用返回的字节对象中的实际字节,struct用于将缓冲区中的4个字节作为单个32位整数读取.
| 归档时间: |
|
| 查看次数: |
4886 次 |
| 最近记录: |