在Python中将十六进制字符转换为int
我正在使用图形库进行一些绘图,并希望将结果图像作为Python列表输出(以便将其转换为数组) Pyglet给了我一个十六进制字符串,如下所示:'\xff'(表示一个像素上的值为255)。如何将这样的字符串转换为int在Python中将十六进制字符转换为int,python,numpy,pyglet,Python,Numpy,Pyglet,我正在使用图形库进行一些绘图,并希望将结果图像作为Python列表输出(以便将其转换为数组) Pyglet给了我一个十六进制字符串,如下所示:'\xff'(表示一个像素上的值为255)。如何将这样的字符串转换为int 我尝试了int('\xff',16),但这不起作用。请注意,根据定义,“\xnn”被转义并编码为十六进制字符,但它没有告诉我如何将其转换为int。要直接从Python字符串获取NumPy数组,可以使用 s = "\xff\x03" a = numpy.frombuffer(s, n
我尝试了int('\xff',16),但这不起作用。请注意,根据定义,“\xnn”被转义并编码为十六进制字符,但它没有告诉我如何将其转换为int。要直接从Python字符串获取NumPy数组,可以使用
s = "\xff\x03"
a = numpy.frombuffer(s, numpy.uint8)
a = map(ord, s)
要获取列表,您可以使用
s = "\xff\x03"
a = numpy.frombuffer(s, numpy.uint8)
a = map(ord, s)
Python 2.6或更高版本中的列表的替代方法是使用
bytesarray
尝试以下操作:
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'
是,
\xff
是字节中十六进制值的打印表示形式。但是int()
不适用于字节的十六进制表示,而适用于数字的字符串表示。16进制世界中的数字是'13'或'ab'或'ff'。因此(但仍然很有趣),int('ff',16)
工作正常。如果你想这样做,你需要去掉'\x':-)。这里有一个通用的方法,可以处理具有可变长度子字符串的十六进制字符串,例如:
s = '5b1\n5\n3ad44'
以下代码通过矢量化在2秒内(在MacBook上)将一个具有300万可变长度十六进制子字符串的字符串转换为一个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]
我认为你真正的问题应该是:将图像放入numpy阵列的最佳方法是什么。您尝试过
imread
函数吗?但这只适用于单个字节,对于单个字节,它相当于ord(a)
,因此它似乎有点毫无意义。@Sven它似乎适用于较长的字符串int(“\xff\x34\xbf\x25”。encode('hex'),16)
->4281646885L@ThomasH:在给定的上下文中,此结果完全没有意义。要将字符串转换为整数列表,必须单独处理字符串的每个字节。将整个字符串转换为单个整数当然可以这样做,但这与问题完全无关。@Sven你是对的。我刚刚发现您的“但这只适用于单个字节”公式有误导性。请注意,“\xff”
是一个带有单个字符的字符串。你的回答表明这个字符串有四个字符。@Sven你是对的,但我只是想隐喻性地说出最后一句话。从技术上讲,另一个答案的.encode
方法将是实现这一目标的方法。