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

时间:2016-08-10 07:13:58

标签: python struct hex long-integer endianness

我希望在big endian中得到99997的值(2642804992),然后将答案作为长值返回

这是我在python中的代码:

{{1}}
  

输出:%x设置([' \ x00 \ x01 \ x86 \ x9d'])

     

错误:基数为16的long()文字无效:' \ x00 \ x01 \ x86 \ x9d'

由于字符串已经是十六进制形式,为什么它不能转换为长?如何删除此错误以及此问题的解决方案是什么。

4 个答案:

答案 0 :(得分:1)

pack 将返回您提供的数据的字符串表示。

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

编辑:

试试这个

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

请注意使用 I ,这样数字就会被视为无符号值

答案 1 :(得分:1)

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

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

这将r设置为-1652162304

答案 2 :(得分:0)

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

这主要用于嵌入发送给big-endian机器的消息(PowerPC,M68K,...)

像这样转换为long意味着将ttm字符串解析为0x1869D为ASCII。 (并且print语句不能用于BTW)

如果我只关注你的问题标题:&#34;将十六进制字符串转换为long&#34;:

只需使用long("0x1869D",16)即可。无需序列化它。 (BTW long仅适用于python 2.在python 3中,您必须使用int,因为所有数字都以long形式表示)

好吧,我正在回答解释为什么它会失败,但当我真正知道你想做什么时,我会编辑我的答案。

答案 3 :(得分:0)

这是一个很好的问题。

以下是您要找的内容。

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

评论我在Python 3上尝试了它。但是在Python 2上它几乎是相同的,你不会将b附加到字符串上,但是否则它是相同的的事情。