2009-09-19 34 views
2

我想一個2.5程序轉換到3轉換2.5字節比較,以3

有沒有在Python 3的方式來改變一個字節的字符串,如b「\ X01 \ X02」的蟒蛇2.5樣式的字符串,比如'\ x01 \ x02',這樣字符串和逐字節比較的工作方式與2.5相似?我正在從二進制文件中讀取字符串。

我有一個2.5程序從文件中讀取字節,然後比較或處理每個字節或字節組合與指定的常量。要下3運行的程序,我想避開我所有的常量變爲字節,字節字符串(「\ X01」到B「\ X01」),然後處理問題在3,如:

a = b'\x01' 
b = b'\x02' 

(a+b)[0] != a 

即使類似的操作工作在2.5。我必須做(a + b)[0] == ord(a),而a + b == b'\ x01 \ x02'可以正常工作。 (順便說一句,我該怎麼做(a + b)[0]所以它等於?)

解包結構也是一個問題。

我是否缺少一些簡單的東西?

回答

3

字節是一個整數不變序列(取值範圍爲0 < =到< 256),所以當你訪問(a+b)[0]你找回一個整數,完全相同的一個你會通過訪問a[0]得到。所以當你將序列號a與整數(a+b)[0]進行比較時,它們自然不同。使用

切片標誌,但是你可以得到一個序列回:

>>> (a+b)[:1] == a   # 1 == len(a) ;) 
True 

因爲切片返回字節對象。

我也建議運行2to3實用程序(它需要與py2k運行)來自動轉換一些代碼。它不會解決你所有的問題,但它會有很大的幫助。

+0

>>因此,當您將序列a與整數(a + b)[0]進行比較時,它們本質上是不同的。>>除了2.5中的類似項目不是這種情況。我意識到爲什麼這在py3k的上下文中有意義,但它使轉換繁瑣 – foosion 2009-09-20 00:32:17

+0

2to3(在py3k下運行)有助於爲打印語句添加parens。它對字節和字符串問題沒有做任何事情,爲此找到一個通用的解決方案是很好的。 – foosion 2009-09-20 00:35:36