我希望在big endian中得到99997的值(2642804992),然后将答案作为长值返回
这是我在python中的代码:
{{1}}
输出:%x设置([' \ x00 \ x01 \ x86 \ x9d'])
错误:基数为16的long()文字无效:' \ x00 \ x01 \ x86 \ x9d'
由于字符串已经是十六进制形式,为什么它不能转换为长?如何删除此错误以及此问题的解决方案是什么。
答案 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
附加到字符串上,但是否则它是相同的的事情。