在開發中,咱們偶爾會遇到須要將數據經過控制檯打印出來,以檢查數據傳輸的準確性。例如調試服務端剛接到的二進制數據(裏面包含不少非可見字符,也就是ASCii碼以外的字節值,或是字節值不是字母和數字的,是一些特殊符號),如物聯網的MQTT協議的信息,以及咱們自定義的二進制應用協議,而不是基於可見字符或JSON組裝的信息流。但咱們但願看到的是相似這樣的信息「0A 53 49 B7 FC 2E」。python
這些二進制數據若是直接用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進制描述的,因此在服務端輸出格式統一的數據流格式,方便你們交流。code
上面的實現也能夠用循環打印(在打印的時候格式化和加空格)實現,可是寫起來略顯臃腫,可是不用生成新的列表,對瞬間內存佔用有利(抱歉,寫硬件代碼留下的習慣,老是會想到內存佔用,由於單片機的資源實在有限)你們能夠根據這個本身改進。內存