【问题标题】:Convert integer to hex in Python在 Python 中将整数转换为十六进制
【发布时间】:2012-07-25 20:46:47
【问题描述】:

在 Python 中,我想将整数 3892 转换为具有给定格式和结果 \x00\x00\x0F\x34 的十六进制代码。如何实现?

【问题讨论】:

  • 整数超过32位怎么办?
  • 嗯,所以你想要基于希望和祈祷的代码,很好。当您说“具有给定格式的十六进制代码”时,您的意思是字面上表示大端机器上的 32 位值 0x0f34 的字节字符串,还是字面意思是字符串 "\\x00\\x00\\x0F\\x34"
  • 也就是说,你需要16个字符的字符串(文本表示)还是4字节(二进制表示)?

标签: python integer hex


【解决方案1】:

您正在转换为数字的二进制表示,而不是十六进制表示(尽管 Python 会将字节显示为十六进制)。使用struct module 进行此类转换。

演示:

>>> struct.pack('>I', 3892)
'\x00\x00\x0f4'
>>> struct.pack('>I', 4314)
'\x00\x00\x10\xda'

请注意,'4' 的 ASCII 码是 0x34,如果它是不可打印的字符,python 只会显示带有\x 转义符的字节。因为 0x34 是可打印的,python 将其输出为 4

上面格式代码中的

'>' 表示“big endian”,而“I”是无符号 int 转换(4 个字节)。

【讨论】:

  • 3892不是十进制0xf34十六进制吗?
  • @martineau:我在回答中提到了这一点; python 显示 '4' 因为那是代码位置 0x34 处的 ASCII 字符。因此,字节序列中的最后一个字符是\x34,但因为它是可打印的,所以它不会显示为十六进制转义。
  • 啊,我明白你现在回答中声明的意思了,谢谢。目前尚不清楚 OP 是否想要这个或@cdarke 的答案会产生什么,但怀疑它可能是前者,所以必须添加我自己的 +1。
  • 更新了第二个独立的例子,它确实产生了 4 个不可打印的字节。
【解决方案2】:
import re
print re.sub(r'([0-9A-F]{2})',r'\\x\1','%08X' % 3892)

给予:

\x00\x00\x0F\x34

【讨论】:

  • 哇!就是这样 - 真的很酷。非常感谢。 @cdarke 为了我平庸的正则表达式技能:你能给我一个你的正则表达式的简短解释吗?
  • 这会生成一个 16 字符的字符串,其中包含文字反斜杠、文字 x 和文字数字。 '%08X' 产生十六进制数字,正则表达式每两个数字插入一个文字 \x。我的解决方案生成 4 个字节,其中包含您的号码作为无符号 C long value。您需要弄清楚需要写入文件的格式;如果它是二进制格式,我的赌注是我的答案。 :-)
  • 抱歉耽搁了,我一直在旅行。 RE 如下(除了@Martijn Pieters 的正确解释):([0-9A-F]{2}) 正好查找 2 个十六进制数字。括号 () 捕获我们匹配的内容,并在替换字符串中表示为 \1(称为反向引用)。 \\x 在捕获的两个字符前加上 \x 前缀。如果您对我的解决方案感到满意,那就太好了,但我同意其他人的观点,即您的问题有点模棱两可。
【解决方案3】:

如果你安装了 numpy:

>>> import numpy as np
>>> np.int32(3892).tostring()
'4\x0f\x00\x00'

【讨论】:

  • 感谢您的快速解答!但是我需要 \x00\x00\x0F\x34 作为实际结果,因为我必须将它导入回文件中。可以这样做吗?
猜你喜欢
  • 2010-10-16
  • 2019-04-30
  • 2014-04-16
  • 2016-12-04
  • 1970-01-01
  • 2018-07-24
相关资源
最近更新 更多