当没有字母数字时,bytearray.fromhex不会转换

时间:2015-01-16 16:17:30

标签: python python-2.7 hex bytearray

我试图将一个数字(任意大小,可能很长)转换为相应的字节串。例如,输入数字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中添加了某种不可见的字符。是这种情况吗?

如何实现正确的转换?

2 个答案:

答案 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))