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))
我正在尝试将一个数字(任意大小,可能很长)转换成相应的字节串。例如输入数字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))