2015-11-16 2 views
0

Так что я хочу упаковать список кортежей, а затем распаковать его позже.python: размер структурного пакета дольше, чем ожидалось - почему это происходит?

from struct import * 
from itertools import chain 
a = [(1, 67), (213, 455), (9009, 8887)] 
# converts 3x2 list to 6x1 list 
b = list(chain(*a)) 
size=6 
qq = pack('h'+'L'*size,size,*b) 
# peak to get the list length 
mysize = unpack('h',qq[:2]) 
mysize = mysize[0] 
unpack('L',qq[2:6])  
unpack('h'+'L'*mysize,qq) 
unpack('L'*mysize, qq[2:]) # does not work 
unpack('L'*mysize, qq[2:2+mysize*4]) # works 

Использование Python 2.7, вторая в последнюю строку не работает. Я испытал len(qq), который является 28, когда я ожидал 26.

ответ

1

Согласно docs:

типа C представлены в собственном формате и порядком байтов аппарата, и правильно выровнены, пропуская колодки байтов, если это необходимо (в соответствии с правилами, используемыми компилятором C).

Поскольку вы работаете на 64-битной машине, более мелкие типы, такие как h и L, дополняются 8 байтами. Вы можете использовать флаги форматирования =, <, >, ! для удаления прокладки. Например, добавление работ «=»

from struct import * 
from itertools import chain 
a = [(1, 67), (213, 455), (9009, 8887)] 
# converts 3x2 list to 6x1 list 
b = list(chain(*a)) 
size=6 
qq = pack('=h'+'L'*size,size,*b) 
# peak to get the list length 
mysize = unpack('=h',qq[:2]) 
mysize = mysize[0] 
unpack('=L',qq[2:6])  
unpack('=h'+'L'*mysize,qq) 
unpack('=' + 'L'*mysize, qq[2:]) # does not work 
unpack('=' + 'L'*mysize, qq[2:2+mysize*4]) # works 
Смежные вопросы