Python輸出16進制不帶0x補零,整數轉16進制,字符串轉16進制
在開發中,我們偶爾會遇到需要將數據通過控制台打印出來,以檢查數據傳輸的准確性。例如調試服務端剛接到的二進制數據(里面包含很多非可見字符,也就是ASCii碼之外的字節值,或是字節值不是字母和數字的,是一些特殊符號),如物聯網的MQTT協議的信息,以及我們自定義的二進制應用協議,而不是基於可見字符或JSON組裝的信息流。但我們希望看到的是類似這樣的信息“0A 53 49 B7 FC 2E”。
這些二進制數據如果直接用print()函數打印,則在控制台看到的是以字節值代表的字符形式,看到的很多就是亂碼。如果用Python里的hex()函數轉一下再依次輸出,會在每個前面都帶有“0x”字符,並且01會打印成1,看起來就很不整齊,感覺比較亂,並且打印的時候要人為在每個字節后面加入空格才能分開字節。
經過實踐,我們可以通過格式化輸出將字節值變成16進制字符后,再用join()函數輸出,就可以實現我們要的效果了,想打印字符串的ASCii值也可以,只不過先用ord()函數轉一下,下面是我封裝的兩個函數,分別對應字節類型和字符串類型的輸出,調試通過,僅供參考。
打印字節類型的:
# 字節列表以16進制格式打印數據
def print_bytes_hex(data):
lin = ['%02X' % i for i in data]
print(" ".join(lin))
# 測試字節列表,這也是網絡傳輸收到的原始類型
arr = [0x4B, 0x43, 0x09, 0xA1, 0x01, 0x02, 0xAB, 0x4A, 0x43]
print_bytes_hex(arr)
'''
控制台輸出:
4B 43 09 A1 01 02 AB 4A 43
'''
打印字符串類型的:
# 字符串或字符列表以16進制格式打印數據
def print_string_hex(data):
lin = ['%02X' % ord(i) for i in data]
print(" ".join(lin))
# 測試字符串類型
arr = 'Work'
print_string_hex(arr)
'''
控制台輸出:
57 6F 72 6B
'''
如果我們是開發物聯網的項目,涉及到信令需要與硬件開發人員交流的時候,硬件那邊基本都是以16進制描述的,所以在服務端輸出格式統一的數據流格式,方便大家交流。
上面的實現也可以用循環打印(在打印的時候格式化和加空格)實現,但是寫起來略顯臃腫,但是不用生成新的列表,對瞬間內存占用有利(抱歉,寫硬件代碼留下的習慣,總是會想到內存占用,因為單片機的資源實在有限)大家可以根據這個自己改進。