簡體   English   中英

用struct.unpack讀取4個字節

[英]Reading 4 bytes with struct.unpack

我有一個文件,其字節#11-15持有一個4字節長的整數。 使用struct.unpack ,我想將其讀取為4字節整數。 現在,將PACK_FORMAT設置為8s2s4B2s16B96s40B40B ,我讀取了4個單獨的字節:

PACK_FORMAT = '8s2s4B2s16B96s40B40B'
fd = open('./myfile', 'r')
hdrBytes = fd.read(208)
print(repr(hdrBytes))

foo = struct.unpack(PACK_FORMAT, hdrBytes)

(Pdb) foo[0]
'MAGICSTR'
(Pdb) foo[1]
'01'
(Pdb) foo[2:6]
(48, 50, 48, 48)
(Pdb) print repr(hdrBytes)
'MAGICSTR010200a0000000001e100010........`

現在,我可以將這4個字節轉換為一個int:

(Pdb) int(''.join([chr(x) for x in foo[2:6]]), 16)
512

當我修改PACK_FORMAT以使用i而不是4B來讀取4個字節時,卻總是出現錯誤:

foo = struct.unpack(PACK_FORMAT, hdrBytes)
error: unpack requires a string argument of length 210

您似乎違反了對齊要求:整數必須在計算機的4字節邊界上。

您可以通過以等號開頭的格式字符串來關閉對齊方式:

PACK_FORMAT ='= 8s2si2s16B96s40B40B'

它與對齊有關—請參閱docs

import struct

PACK_FORMAT1 = '8s 2s 4B 2s 16B 96s 40B 40B'
print(struct.Struct(PACK_FORMAT1).size)  # -> 208

PACK_FORMAT2 = '8s 2s i 2s 16B 96s 40B 40B'
print(struct.Struct(PACK_FORMAT2).size)  # -> 210

PACK_FORMAT3 = '=8s 2s i 2s 16B 96s 40B 40B'
print(struct.Struct(PACK_FORMAT3).size)  # -> 208

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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