将十六进制字符串转换为长 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
附在字符串上,除此之外都是一样的。
我想获得大端 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
附在字符串上,除此之外都是一样的。