Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/355.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Python中将十六进制字符转换为int_Python_Numpy_Pyglet - Fatal编程技术网

在Python中将十六进制字符转换为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

我正在使用图形库进行一些绘图,并希望将结果图像作为Python列表输出(以便将其转换为数组)

Pyglet给了我一个十六进制字符串,如下所示:'\xff'(表示一个像素上的值为255)。如何将这样的字符串转换为int


我尝试了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
方法将是实现这一目标的方法。