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

2 投票
4 回答
16124 浏览
提问于 2025-04-16 16:55

我正在使用一个叫做 Pyglet 的图形库来进行绘图,想把得到的图像转换成一个Python列表(这样我就可以把它转成 NumPy 数组)。

Pyglet给我返回了一串十六进制字符,比如:'\xff'(这表示某个像素的值是255)。我该怎么把这样的字符串转换成整数呢?

我试过用 int('\xff', 16),但这不管用。根据 文档 的说法,'\xnn' 是经过转义的,表示一个十六进制字符,但文档没有告诉我怎么把它转换成整数。

4 个回答

1

这里有一种通用的方法,可以处理长度不固定的十六进制字符串,比如:

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]
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'
11

如果你想直接从一个Python字符串获取一个NumPy数组,可以使用

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

如果你想得到一个列表,可以使用

a =  map(ord, s)

在Python 2.6及以上版本中,获取列表的另一种选择是使用 bytesarray(s)

撰写回答