[英]the reason: python string assignments accidentally change '\b' into '\x08' and '\a' into '\x07', why Python did this?
[英]Python 3.5 - Convert bytes object to 16bit hex string (b'\x07\x89' -> '0x0789')
某些設備以以下形式返回數據(十六進制字節)
data = b'\x07\x89\x00\x00\x12\x34'
如何將其轉換為以下形式?
['0x0789', '0x0000', '0x1234']
我已經嘗試過六角化的成分。 我正在使用Python 3.5。
從bytes
對象中取出兩個一組。 將每個組的第一個值乘以16 ** 2。 將兩個值相加。 在結果上使用hex
將其轉換為字符串表示形式。
>>> [hex(data[i]*16**2 + data[i+1]) for i in range(0,len(data),2)]
['0x789', '0x0', '0x1234']
我假設您現在不需要用無用的零填充字符串。
使用struct模塊; 它具有unpack
功能,可以指定數據塊的大小大小(字節,2字節,4字節)和字節序。 如果您擁有的是大尾數半字大小的數據塊,則正確的格式鍵為“ H”。
要一次解析所有數據,請在格式說明符中添加計數:例如“> 3H”用於輸入數組。 您還可以動態寫入字段數。
完整示例:
import struct
data = b'\x07\x89\x00\x00\x12\x34'
d = struct.unpack(">{}H".format(len(data) // 2), data) # extract fields
result = [hex(x) for x in d] # convert to strings
分兩個步驟:
您可以使用stdlib中的array
模塊 :
import sys
from array import array
a = array('H', data)
if sys.byteorder != 'big':
a.byteswap() # use big-endian order
result = ['0x%04X' % i for i in a]
# -> ['0x0789', '0x0000', '0x1234']
它非常有效, 尤其是在您需要從文件讀取數據時 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.