我试图将一个数字(任意大小,可能很长)转换为相应的字节串。例如,输入数字1094795585(基数10),即0x41414141(基数为16),应返回“\ 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)时,我收到错误“奇长字符串”。
当我输入数字1094795584(0x41414140)时,我收到错误“在位置2的fromhex()arg中找到的非十六进制数”。
这让我觉得Python在hex_string
中添加了某种不可见的字符。是这种情况吗?
如何实现正确的转换?
答案 0 :(得分:2)
你应该不解码十六进制的字符串;放弃.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@')
答案 1 :(得分:0)
这应该有效:
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))