将整数转换为具有特定格式的十六进制字符串

Posted

技术标签:

【中文标题】将整数转换为具有特定格式的十六进制字符串【英文标题】:Convert integer to hex-string with specific format 【发布时间】:2011-10-16 00:53:48 【问题描述】:

我是 python 新手,遇到以下问题:我需要将整数转换为 6 字节的十六进制字符串。

例如 281473900746245 --> "\xFF\xFF\xBF\xDE\x16\x05"

十六进制字符串的格式很重要。 int 值的长度是可变的。

“0xffffbf949309L”格式不适合我。 (我用 hex(int-value) 得到这个)


我的最终解决方案(经过一些“玩”后)是:

def _tohex(self, int_value):
    data_ = format(int_value, 'x')

    result = data_.rjust(12, '0')
    hexed = unhexlify(result)

    return hexed

感谢大家的帮助!

【问题讨论】:

你想要Python字符串文字"\xFF\xFF\xBF\xDE\x16\x05"定义的长度为6的字符串还是"\\xFF\\xFF\\xBF\\xDE\\x16\\x05"给出的长度为24的字符串? 术语“十六进制字符串”和“格式”具有误导性,您真正想要的是将任意大小的整数形成大端顺序的字节字符串。 请原谅我的英语 - 我刚刚从我的第一语言翻译了这些条款 - 谢谢你的翻译。 【参考方案1】:

可能有更好的解决方案,但您可以这样做:

x = 281473900746245
decoded_x = hex(x)[2:].decode('hex') # value: '\xff\xff\xbf\xde\x16\x05'

细分:

hex(x)                     # value: '0xffffbfde1605'
hex(x)[2:]                 # value: 'ffffbfde1605'
hex(x)[2:].decode('hex')   # value: '\xff\xff\xbf\xde\x16\x05'

更新:

根据@multipleinstances 和@Sven 的cmets,由于您可能正在处理长值,您可能需要稍微调整一下十六进制的输出:

format(x, 'x')     # value: 'ffffbfde1605'

然而,有时,十六进制的输出可能是奇数长度,这会破坏解码,因此最好创建一个函数来执行此操作:

def convert(int_value):
   encoded = format(int_value, 'x')

   length = len(encoded)
   encoded = encoded.zfill(length+length%2)

   return encoded.decode('hex')

【讨论】:

在我的系统上,hex(x)[2:] 产生 ffffbfde1605L,这会在解码中导致 TypeErrorhex(x)[2:-1] 可能会更好。 @multipleinterfaces:无条件剥离最后一个字节是个坏主意。不过,hex(x)[2:].rstrip("L") 应该可以完成这项工作。 @multiple 实际上,这不适用于 L 值,因为十六进制输出可能是奇数长度(出于某种原因)。 @Manny:您的解决方案不适用于由奇数个十六进制字符组成的任何数字。例如,27480xABC,而str.decode('hex') 将需要0abc 而不是abc 为了避免使用0x 前缀和L 后缀的麻烦,请使用format(number, 'x') 而不是hex()【参考方案2】:

在 Python 3.2 或以上版本中,可以使用整数的to_bytes() 方法。

>>> i = 281473900746245       
>>> i.to_bytes((i.bit_length() + 7) // 8, "big")
b'\xff\xff\xbf\xde\x16\x05'

【讨论】:

值得一提的是,您需要预先计算所需的长度(使用math.logint.bit_length)并且可能要指定byteorder='big' @Ferdinand:谢谢,扩展了我的答案。【参考方案3】:

如果您不使用 Python 3.2(我很确定您不会),请考虑下一种方法:

>>> i = 281473900746245
>>> hex_repr = []
>>> while i:
...     hex_repr.append(struct.pack('B', i & 255))
...     i >>= 8
...
>>> ''.join(reversed(hex_repr))
'\xff\xff\xbf\xde\x16\x05'

【讨论】:

我测试了这种方法......它只有在 int 值不短的情况下才有效。例如与 i=2 我得到 '\x02\x1d\x08\xff\xff\xbf\xde\x16\x05'...

以上是关于将整数转换为具有特定格式的十六进制字符串的主要内容,如果未能解决你的问题,请参考以下文章

16进制字符串如何转化16进制数值

c语言编一函数将一十进制整数转换为十六进制整数,谢谢

如何将 gi-normous 整数(字符串格式)转换为十六进制格式? (C#)

如何将字符串转换为具有特定位数的十进制[重复]

如何将二进制整数转换为十六进制字符串?

PHP如何将从二进制文件中读取的字节转换为数字