将十六进制字符串转换为长 python

Convert Hexadecimal string to long python

我想获得大端 99997 的值,即 (2642804992),然后 return 作为长值的答案

这是我在 python 中的代码:

v = 99997
ttm = pack('>i', v) # change the integer to big endian form 
print ("%x"), {ttm}
r = long(ttm, 16) # convert to long (ERROR)
return r

Output: %x set(['\x00\x01\x86\x9d'])

Error: invalid literal for long() with base 16: '\x00\x01\x86\x9d'

由于字符串已经是十六进制形式,为什么不将其转换为长整数?我将如何消除这个错误以及这个问题的解决方案是什么。

您刚刚将整数值转换为大端二进制字节。

这主要用于嵌入发往 big-endian 台机器(PowerPC、M68K 等)的消息中

像这样转换为 long 意味着将 ttm 字符串解析为 ASCII,该字符串应为 0x1869D。 (顺便说一句,打印语句也不起作用)

如果我只是按照你的问题标题:"Convert hexadecimal string to long":

只需使用 long("0x1869D",16)。不需要序列化它。 (顺便说一句,long 仅适用于 python 2。在 python 3 中,您必须使用 int,因为所有数字都以 long 形式表示)

嗯,我回答是为了解释为什么它一定会失败,但当我真的知道你想做什么时,我会编辑我的答案。

pack 将 return 您提供的数据的字符串表示形式。

字符串表示不同于长数字的 base 16。注意每个数字前的 \x

编辑:

试试这个

ttm = pack('>I',v)
final, = unpack('<I',ttm)
print ttm

注意 I 的使用,因此数字被视为无符号值

您必须使用 struct.unpack 作为 struct.pack 的反向操作。

r, = unpack('<i', ttm)

这将 r 设置为 -1652162304

这是一个很好的问题。

这是您要查找的内容。

s = str(ttm)
for ch in r"\bx'":
    s = s.replace(ch, '')

print(int(s, 16))

问题在于ttm在某些方面类似于字符串。这就是它的样子:b'\x00\x01\x86\x9d'。将它提供给 int(或 long)保留所有非十六进制字符。我删除了它们然后它起作用了。

删除非十六进制数字字符后,剩下的 0001869d 确实是 99997

评论我在Python3上试过了,但是在Python2上就差不多了,你不会有b 附在字符串上,除此之外都是一样的。