簡體   English   中英

在 Python 中將十六進制字符轉換為 int

[英]Converting a hexadecimal character to an int in Python

我正在使用圖形庫Pyglet進行一些繪圖,並希望將生成的圖像作為 Python 列表(所以我可以將其轉換為NumPy數組)。

Pyglet 給了我一串十六進制字符,如下所示:'\xff'(表示一個像素的值為 255)。 如何將這樣的字符串轉換為 int?

我試過 int('\xff', 16),但這不起作用。 請注意,根據文檔,'\xnn' 被轉義並編碼為十六進制字符,但它沒有告訴我如何將其轉換為 int。

要直接從 Python 字符串獲取 NumPy 數組,您可以使用

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

要獲取列表,您可以使用

a =  map(ord, s)

Python 2.6 或更高版本中的列表的替代方法是使用bytesarray(s)

嘗試這樣的事情:

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'

這是一種處理具有可變長度子字符串的十六進制字符串的通用方法,例如:

s = '5b1\n5\n3ad44'

以下代碼通過向量化在 2 秒內(在 MacBook 上)將具有 300 萬個可變長度十六進制子字符串的字符串轉換為 numpy integer 數組:

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]

是的, \xff是以字節為單位的十六進制值的打印表示。 但是int()不適用於字節的十六進制表示,而是數字的字符串表示。 base-16 世界中的數字是“13”或“ab”或“ff”。 因此(但仍然很有趣), int('ff',16)工作正常。 如果你想 go 那條路線,你需要去掉'\x':-)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM