我想將字符串編碼爲字節。將字節打印爲十六進制
要轉換爲輪空,我用byte.fromhex()
>>> byte.fromhex('7403073845')
b't\x03\x078E'
但它顯示一些字符。
它如何顯示爲十六進制,如下所示?
b't\x03\x078E' => '\x74\x03\x07\x38\x45'
我想將字符串編碼爲字節。將字節打印爲十六進制
要轉換爲輪空,我用byte.fromhex()
>>> byte.fromhex('7403073845')
b't\x03\x078E'
但它顯示一些字符。
它如何顯示爲十六進制,如下所示?
b't\x03\x078E' => '\x74\x03\x07\x38\x45'
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'
我想編碼字符串字節。
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
可以覆蓋'sys.displayhook',改如何'bytes'顯示在REPL。 – jfs
@ J.F.Sebastian:Eew ...每天學習新的可怕的東西。不要誤會我的意思,那很酷。但是由於代碼定義在某處完全不同,所以用其他的東西替換正常的'repr'這個想法讓我感到恐慌;當你期待一件事情時會遇到可怕的混亂,並得到完全不同的東西。儘管如此,你給了我一些有趣的想法,用於修改具有「PYTHONSTARTUP」文件的人。 ;-) – ShadowRanger
二進制數據應該顯示爲二進制(hex repr)並不是一個奇怪的想法。據我所知,許多協議可以自由混合使用ascii文本和二進制數據,並且Python 2已經存在,其中文本和二進制數據通常表示爲「str」類型。如果從頭開始設計'repr(b'\ x74')'應該是什麼樣的問題(爲什麼你認爲''b't'''裏面有例如圖像數據比'b'\ x74好''''?) – jfs