在Python中将十六进制字符转换为int

2024-04-19 07:36:15 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

我试过int('\xff',16),但那不起作用。注意,根据the documentation,'\xnn'被转义并编码为hexedecimal char,但它不告诉我如何将其转换为int


Tags: the字符串图像numpy绘图列表documentation像素
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'

要直接从Python字符串获取NumPy数组,可以使用

s = "\xff\x03"
a = numpy.frombuffer(s, numpy.uint8)

为了得到一个你可以使用的列表

a =  map(ord, s)

Python 2.6或更高版本中列表的另一种选择是使用bytesarray(s)

下面是一种处理具有可变长度子字符串的十六进制字符串的通用方法,例如:

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]

相关问题 更多 >