Разное поведение struct.pack () - PullRequest
0 голосов
/ 29 марта 2020

Когда я пытался запустить эту же программу на моем компьютере и сервере моей школы, я получаю эти два различных поведения от struct.pack(...).

Это от моего компьютера

Python 3.7.0 (default, Oct  9 2018, 10:31:47) 
[GCC 7.3.0] :: Anaconda, Inc. on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import struct
>>> struct.pack('HL',0,123456)
b'\x00\x00\x00\x00\x00\x00\x00\x00@\xe2\x01\x00\x00\x00\x00\x00'

Это с моего школьного сервера

Python 3.7.0 (default, Aug  1 2018, 14:55:42) 
[GCC 4.8.4] on sunos5
Type "help", "copyright", "credits" or "license" for more information.
>>> import struct
>>> struct.pack('HL',0,123)
b'\x00\x00\x00\x00\x00\x00\x00{'

Как видите, длина вывода в обеих системах различна по причинам, не связанным с версией Python. Есть ли способ заставить или заставить вывод иметь длину 8 или 16 байтов? Формат HL на самом деле имеет длину всего 6 байтов, но на школьном сервере он расширяется до 8 байтов. На моем локальном компьютере «HL» почему-то расширяется до 16 байт.

Это поведение является критическим, потому что мне нужно передать эту функцию позже на struct.unpack(...), что потребовало бы вводов различной длины в зависимости от длины вывода от struct.pack(...).

1 Ответ

1 голос
/ 29 марта 2020

Вы выполняете один и тот же код на двух разных компьютерах, который интерпретирует формат для упаковки по-разному в зависимости от используемой 32- или 64-разрядной ОС.

На 32- и 64-разрядных архитектурах размеры из основных типов различаются, что дает разную длину. Дважды в секунду на 64-битной архитектуре для вашего конкретного примера.

Пожалуйста, посмотрите на эту страницу для лучшего понимания.

Я держу пари, что вы выполняете первый код на 64-битной машине, а второй на 32-битной машине.

Вы можете запустить этот код, чтобы определить, используете ли вы 32- или 64-битную архитектуру. Подробнее см. здесь

python -c 'import struct;print( 8 * struct.calcsize("P"))'

На первом аппарате должно быть 64, на втором - 32.

Фактически, если вы упаковываете и распаковываете данные на та же машина, у вас не будет никаких проблем. Но когда вы начнете отправлять двоичные данные с одного компьютера на другой без каких-либо мер предосторожности, вы столкнетесь с проблемами. (Проблема 32/64, как вы встретили, endianess). Вот почему вам нужно описать кодировку данных при работе с несколькими машинами. HDF5 - это хранилище файловых данных, которое может помочь вам справиться со всеми этими трудностями.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...