我正在使用图形库Pyglet进行绘图,并希望将结果图像作为Python列表输出(因此我可以将其转换为NumPy数组)。
Pyglet给了我一串十六进制字符,如下所示:'\ xff'(表示一个像素的值为255)。如何将这样的字符串转换为int?
我尝试过int('\ xff',16),但这不起作用。请注意,根据the documentation,'\ xnn'被转义并编码为十六进制char,但它并没有告诉我如何将其转换为int。
答案 0 :(得分:10)
要直接从Python字符串获取NumPy数组,可以使用
s = "\xff\x03"
a = numpy.frombuffer(s, numpy.uint8)
要获取列表,您可以使用
a = map(ord, s)
Python 2.6或更高版本中列表的替代方法是使用bytesarray(s)
。
答案 1 :(得分:3)
尝试这样的事情:
a = '\xff'
print int(a.encode('hex'), 16)
255
编辑:对不起,以前的版本有错误 - 解码而不是编码。这很有效。
编辑2:我实际上误读了这个问题,正如评论者指出的那样。这可能已经很明显,但万一有人发现它有用,常规的python列表解决方案将是:
>>> a = '\xff\xfe'
>>> [str(ord(char)) for char in a]
['255', '254']
>>> ' '.join([str(ord(char)) for char in a])
'255 254'
答案 2 :(得分:1)
这是一种处理带有可变长度子串的十六进制字符串的通用方法,例如:
s = '5b1\n5\n3ad44'
以下代码通过矢量化将具有300万个可变长度十六进制子串的字符串转换为2秒内(在MacBook上)的numpy整数数组:
import numpy as np, pandas as pd, cStringIO
s = ('5b1\n5\n3ad44\n' * 1000000)[:-1] # 3m item hex string (variable element length)
# change hex to 2 digit decimal
for i in range(0,9): s = s.replace(str(i),'0' + str(i))
for i in [['a','10'],['b','11'],['c','12'],['d','13'],['e','14'],['f','15']]:
s = s.replace(i[0],i[1])
# read string into numpy
n = np.array(pd.read_csv(cStringIO.StringIO(s), header=None)[[0]]).astype('int64')
# fix base
n = (n % 100) + 16 * ((n % 10000)/100) + 256 * ((n % 1000000)/10000) + 4096 * ((n % 100000000)/1000000) + 65536 * ((n % 10000000000)/100000000)
n[0:3] # confirm correct transformation to [1457, 5, 240964]
答案 3 :(得分:0)
是的,\xff
是字节中十六进制值的打印表示。但是int()
不能用于字节的十六进制表示,而是用于数字的字符串表示。 base-16世界中的数字是'13'或'ab'或'ff'。因此(但仍然有趣),int('ff',16)
工作正常。如果你想走那条路,你需要摆脱'\ x': - )。