Numpy Int Array到HEX然后到String Conversion PYTHON

时间:2016-09-02 21:19:20

标签: python arrays string numpy

我有几个问题

说我有一个numpy数组

a = np.array([0,1,2,3,4,31])

a0 = a[0]
a1 = a[1]
a2 = a[2]
a3 = a[3]
a4 = a[4]
a5 = a[5]


print hex(a4), hex(a5)

给了我

   0x4L 0x1F

对于a0,a1,a2,a3,a5相同。我知道L是因为numpy数组。

现在我怎么得到0x04而不是0x4。

我要求的结果是

'0x1F0403020100'

我需要的答案应该从0x开始 - a5,a4,a3,a2,a1,a0的十六进制值 - 不带OX。所需的输出是一个字符串。如果我有零,我可以做位操作。但并非没有它。

4 个答案:

答案 0 :(得分:2)

你真正想做的是通过将数组中的每个元素移动一定数量的位来将数组存储在一个数字中:

>>> a = np.array([0,1,2,3,4,31])
>>> hex(sum([ai*256**i for i,ai in enumerate(a)]))
'0x1f0403020100'

但要实现这一点,您需要确保您的数组元素最多为255.这完全取决于您保留/检查。您应该考虑使用ndarray dtype np.uint8 {{1}},这样您就无法修改数组中的数据(因为您无法拥有在你的数组溢出。)

答案 1 :(得分:2)

您可以尝试此解决方法。元素明智的hex转换和后来的join'0x'被添加到字符串的开头:

>>> a = np.array([0,1,2,3,4,31])
>>> '0x' + ''.join('{:02X}'.format(i) for i in reversed(a))
'0x1F0403020100'

答案 2 :(得分:2)

<强> TL;博士

("0x" + ("{:0>2x}" * len(a))).format(*tuple(a[::-1]))

<小时/> 的说明:

  • 将字符串"{:0>2x}"乘以等于len(a)的次数,即执行"{:0>2x}" * len(a)。这将创建以下字符串:

    '{:0>2x}{:0>2x}{:0>2x}{:0>2x}{:0>2x}{:0>2x}'
    
    稍后可以使用{:0>2x}方法格式化字符串中使用的

    .format,从而将int转换为宽度为2的十六进制字符串,其中任何填充都使用{{1 }}。
    乘以数组的长度意味着您可以创建许多十六进制格式的参数。

  • 将此字符串连接/加前缀0
  • 通过执行"0x"
  • 来反转您的数组,因为您希望它被颠倒过来
  • 将反转的数组放入元组,即a[::-1]
  • 使用*语法扩展此元组,使其成为方法参数,即tuple(a[::-1])
  • 现在,您可以使用展开的元组作为*tuple(a[::-1])方法的参数,在您创建的包含自定义格式的正确次数的连接字符串上。

结果:

.format

PS。如果您更喜欢大写十六进制字符串,请将>>> ("0x" + ("{:0>2x}" * len(a))).format(*tuple(a[::-1])) '0x1f0403020100' 替换为x,即:

X

答案 3 :(得分:0)

对于python 3.5 +:

'0x'+a.astype(np.uint8)[::-1].tobytes().hex().upper()