2017-12-12 7 views
0

파이썬 3.6.2에서 바이트 개체를 'BQ'형식 (즉, 부호없는 char + 부호없는 long)으로 디코딩하려고합니다. 길이는 9 바이트 있어야하지만, 더 바이트를 요청하는 오류를 struct.unpack 가져옵니다 돼있 있지만, 나는 'QB'의 형식 지정자의 순서를 변경하면struct.unpack() 특정 형식의 패턴을 가진 바이트 개체에서 잘못된 길이가 필요합니다

In [96]: struct.unpack('BQ',bytesObj) 
--------------------------------------------------------------------------- 
error          Traceback (most recent call last) 
<ipython-input-96-667267f631a1> in <module>() 
----> 1 struct.unpack('BQ',bytesObj) 

error: unpack requires a bytes object of length 16 

, 그것은 길이에 대해 불평하지 않습니다 같음 :

'B'대신에 낯선 사람도 있습니다. 3 바이트에 필요한 아이폰에 증가한다 'F',하지만 오류는 동일하게 유지 : 나는 'Q'이전에 사용 형식

In [98]: struct.unpack('fQ',bytesObj) 
--------------------------------------------------------------------------- 
error          Traceback (most recent call last) 
<ipython-input-98-c3792c78fd43> in <module>() 
----> 1 struct.unpack('fQ',bytesObj) 

error: unpack requires a bytes object of length 16 

In [99]: struct.unpack('Qf',bytesObj) 
--------------------------------------------------------------------------- 
error          Traceback (most recent call last) 
<ipython-input-99-78065617d606> in <module>() 
----> 1 struct.unpack('Qf',bytesObj) 

error: unpack requires a bytes object of length 12 

상관없이, 그것의 길이를 요구 항상 같은 오류를 가져옵니다 16. 'Q'에 대한 이전 형식이없는 경우에만 제대로 작동하는 것 같습니다.

나는 뭔가를 놓친가요?

답변

1

파이썬이 구조체의 요소가 C에서와 같은 경계에 정렬되도록 바이트를 포장 추가하기 때문에 9 ~ 16 바이트에서 점프가 발생

의 섹션 7.3에서이에 대한 설명이 있습니다

manual.

q 형식 요소 (long long)와 Q 형식 요소 (unsigned long long)는 8 바이트 경계에서 STARTING을 강제로 정렬합니다. 패딩 바이트는 q/Q 이전의 모든 요소 이후에 추가되어이를 보장합니다. 다음 코드를 실행

행동이 보여줍니다이 도움이

QB: 9 
(1, 2) 
BQ: 16 
(1, 2) 
qB: 9 
(1, 2) 
Bq: 16 
(1, 2) 
Qf: 12 
(1, 2.0) 
fQ: 16 
(1.0, 2) 

희망 :

from struct import * 

print "QB: " + str(calcsize ('QB')) 
bytesObj = pack('QB', 1, 2) 
print unpack('QB', bytesObj) 

print "BQ: " + str(calcsize ('BQ')) 
bytesObj = pack('BQ', 1, 2) 
print unpack('BQ', bytesObj) 

print "qB: " + str(calcsize ('qB')) 
bytesObj = pack('qB', 1, 2) 
print unpack('qB', bytesObj) 

print "Bq: " + str(calcsize ('Bq')) 
bytesObj = pack('Bq', 1, 2) 
print unpack('Bq', bytesObj) 

print "Qf: " + str(calcsize ('Qf')) 
bytesObj = pack('Qf', 1, 2.0) 
print unpack('Qf', bytesObj) 

print "fQ: " + str(calcsize ('fQ')) 
bytesObj = pack('fQ', 1.0, 2) 
print unpack('fQ', bytesObj) 

이 다음과 같은 출력을 제공합니다.

(편집) : OP에서도 지적했듯이이 기본 동작을 재정의 할 수 있습니다. 아래 주석의 링크를 참조하십시오.

+0

대단히 감사합니다! 또한 특수 문자를 사용하여 정렬 프로세스를 비활성화 할 수 있습니다. https://docs.python.org/3.6/library/struct.html#byte-order-size-and-alignment –

관련 문제