2016-01-09 134 views
0

我想將字符串編碼爲字節。將字節打印爲十六進制

要轉換爲輪空,我用byte.fromhex()

>>> byte.fromhex('7403073845') 
b't\x03\x078E' 

但它顯示一些字符。

它如何顯示爲十六進制,如下所示?

b't\x03\x078E' => '\x74\x03\x07\x38\x45' 

回答

0

Python repr無法更改。如果你想做這樣的事情,你需要自己做; bytes對象正試圖最大限度地減少spew,而不是爲您輸出格式輸出。

如果你想打印出來一樣,你可以這樣做:

from itertools import repeat 

hexstring = '7403073845' 

# Makes the individual \x## strings using iter reuse trick to pair up 
# hex characters, and prefixing with \x as it goes 
escapecodes = map(''.join, zip(repeat(r'\x'), *[iter(hexstring)]*2)) 

# Print them all with quotes around them (or omit the quotes, your choice) 
print("'", *escapecodes, "'", sep='') 

輸出是完全按照自己的要求:

'\x74\x03\x07\x38\x45' 
+0

可以覆蓋'sys.displayhook',改如何'bytes'顯示在REPL。 – jfs

+0

@ J.F.Sebastian:Eew ...每天學習新的可怕的東西。不要誤會我的意思,那很酷。但是由於代碼定義在某處完全不同,所以用其他的東西替換正常的'repr'這個想法讓我感到恐慌;當你期待一件事情時會遇到可怕的混亂,並得到完全不同的東西。儘管如此,你給了我一些有趣的想法,用於修改具有「PYTHONSTARTUP」文件的人。 ;-) – ShadowRanger

+0

二進制數據應該顯示爲二進制(hex repr)並不是一個奇怪的想法。據我所知,許多協議可以自由混合使用ascii文本和二進制數據,並且Python 2已經存在,其中文本和二進制數據通常表示爲「str」類型。如果從頭開始設計'repr(b'\ x74')'應該是什麼樣的問題(爲什麼你認爲''b't'''裏面有例如圖像數據比'b'\ x74好''''?) – jfs

0

我想編碼字符串字節。

bytes.fromhex()已經將您的十六進制字符串轉換爲字節。不要混淆的對象和它的文本表示 - REPL使用sys.displayhook使用ASCII碼可打印範圍repr()顯示字節爲對應的字符,但它不以任何方式影響值:

>>> b't' == b'\x74' 
True 

打印字節爲十六進制

的字節轉換回一個十六進制字符串,你可以使用binascii.hexlify()

>>> import binascii 
>>> binascii.hexlify(b't\x03\x078E').decode('ascii') 
'7403073845' 

它怎麼能像下面那樣顯示爲十六進制? b't\x03\x078E' => '\x74\x03\x07\x38\x45'

>>> print(''.join(['\\x%02x' % b for b in b't\x03\x078E'])) 
\x74\x03\x07\x38\x45