[英]Struct.unpack and Length of Byte Object
我有以下代碼(數據是一個字節對象):
v = sum(struct.unpack('!%sH' % int(len(data)/2), data))
令我感到困惑的部分是格式字符串中的%sH和%int(len(data)/ 2
這部分代碼到底如何工作? 字節對象的長度是多少? 而這到底是什么呢?
假設您有一個字節字符串data
例如:
>>> data = b'\x01\x02\x03\x04'
>>> data
'\x01\x02\x03\x04'
長度是字節字符串中的字節(或字符)數:
>>> len(data)
4
因此,這等效於您的代碼:
>>> import struct
>>> struct.unpack('!2H', data)
(258, 772)
這告訴struct
模塊使用以下格式字符 :
!
-使用網絡(大端)模式 2H
打開2 x無符號短褲的包裝(每個16位) 它返回兩個整數,它們對應於我們提供的數據:
>>> '%04x' % 258
'0102'
>>> '%04x' % 772
'0304'
您所做的所有代碼就是自動動態計算unsigned shorts
的數量
>>> struct.unpack('!%sH' % int(len(data)/2), data)
(258, 772)
但是int
常規是不必要的,它實際上不應該使用%s
占位符,因為它用於字符串替換:
>>> struct.unpack('!%dH' % (len(data)/2), data)
(258, 772)
因此,unpack返回兩個整數,這些整數與從數據字節str中解壓縮2個unsigned shorts
有關。 然后,Sum返回這些總和:
>>> sum(struct.unpack('!%dH' % (len(data)/2), data))
1030
data
的字節結構
struct.unpack
使用字符串來確定要解釋的數據的字節格式 stuct.unpack
返回可解釋數據的可迭代值。 要解釋你的數據,你是路過,你創建一個字符串來告訴Python何種形式data
的用武之地。具體的%sH
部分是一個簡短的手這個數字簽名短褲的你再格式要說的確切數量,其unsigned short
你想。
在這種情況下,數字為:
int(len(data) / 2)
因為unsigned short
通常為2個字節寬。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.