bytearray.fromhex 数字中没有字母时不转换

bytearray.fromhex doesn't convert when no letters in number

我正在尝试将一个数字(任意大小,可能很长)转换成相应的字节串。例如输入数字1094795585(10进制),即0x41414141(16进制),应该return "\x41\x41\x41\x41".

目前我有:

def number_to_bytes(number):
    hex_string = hex(number).rstrip("L").lstrip("0x")
    return bytearray.fromhex(hex_string.decode("hex"))

当我输入数字 1094795585 (0x41414141) 时,出现错误 "odd-length string"。

当我输入数字 1094795584 (0x41414140) 时,出现错误 "non-hexadecimal number found in fromhex() arg at position 2"。

这让我觉得 Python 在 hex_string 中添加了某种不可见的字符。是这样吗?

如何实现正确的转换?

你应该从十六进制解码字符串;挂断 .decode('hex') 电话。您需要传入实际的十六进制 数字 ,而不是带有基于这些数字的代码点的字节串。

比较差异:

>>> hex(1094795584)[2:]
'41414140'
>>> hex(1094795584)[2:].decode('hex')
'AAA@'

通过解码,您已经生成了您想要 bytesarray.fromhex() 生成的字节;在那种情况下你可以只使用 bytesarray(hex_string.decode('hex'))

您可以使用 format() 为您的数字生成十六进制格式,不包含 0x 前缀,也不包含长整数的 L 后缀:

import math

def number_to_bytes(number):
    byte_count = int(math.log(number, 256)) + 1
    hex_string = '{:0{}x}'.format(number, byte_count * 2)
    return bytearray.fromhex(hex_string)

演示:

>>> import math
>>> def number_to_bytes(number):
...     nibble_count = int(math.log(number, 256)) + 1
...     hex_string = '{:0{}x}'.format(number, nibble_count * 2)
...     return bytearray.fromhex(hex_string)
...
>>> number_to_bytes(1094795585)
bytearray(b'AAAA')
>>> number_to_bytes(1094795584)
bytearray(b'AAA@')

这应该有效:

import math    
def number_to_bytes(num):
    hex_str = format(num, 'x')
    hex_len = (int(math.log2(num)/8)+1)*2
    return bytearray.fromhex(hex_str.zfill(hex_len))