簡體   English   中英

Python 3.5-將bytes對象轉換為16位十六進制字符串(b'\\ x07 \\ x89'->'0x0789')

[英]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

分兩個步驟:

  1. 將輸入字節字符串分成2個字節的序列
  2. 將序列顯示為十六進制文字。

您可以使用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM