Упаковка невыровненных байтов - PullRequest
0 голосов
/ 25 октября 2018

У меня есть скрипт Perl, который создает двоичный входной файл, который мы передаем другому набору кода.Бинарный входной файл состоит из сотен параметров различной длины.Большинство из них имеют размер 8, 16 или 32 бита.Я пытаюсь преобразовать Perl-скрипт в Python, и меня сбивает с толку несколько параметров длиной 24 бита.

Я посмотрел это сообщение на форуме , оно былоблизко, но не совсем то, что мне нужно.

Например.Допустим, входное значение является целым числом (10187013).Как мне упаковать это до 3 байтов?Если я сделаю что-то вроде этого:

    hexVars  = struct.pack("<L", 10187013)

И затем запишу это в двоичный файл:

    binout = open(binFile, "wb")
    binout.write(hexVars)

Он, как и ожидалось, печатает четыре байта 05 71 9b 00, что яхочу это 05 71 9b.Могу ли я заставить его упаковывать только 3 байта?Или как-то удалить последний байт перед записью?

1 Ответ

0 голосов
/ 25 октября 2018

Упаковка в L всегда дает вам 4 байта - потому что это означает L.Используйте 3 отдельные переменные (каждая 1 байт), или, так как вы все равно конвертируете в строку, просто отрежьте четвертый, неиспользованный байт:

import struct
hexVars  = struct.pack("<L", 10187013)[:3]
print (len(hexVars))
print (ord(hexVars[0]),ord(hexVars[1]),ord(hexVars[2]))
binout = open('binFile', "wb")
binout.write(hexVars)

Содержимое binFile соответствует ожидаемому:

enter image description here

(протестировано; этот код работает как с Python 2.7, так и с 3.6.)

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