Python - запись определенного количества байтов в двоичный файл - PullRequest
0 голосов
/ 30 октября 2019

Извините, если это повторяющийся вопрос, я довольно плохо знаком с Python и не знаю полностью номенклатуру, поэтому трудно найти решения.

Я пытаюсь написать код, который выводитдвоичный файл в определенных целочисленных форматах, то есть раздел в 8 битах, затем 32-битный и т. д. Более конкретно, в формате STL;наброски можно прочитать здесь: Википедия .

Я попытался сделать простой f.write(struct.pack(DATA)) для создания выходного файла, однако конечный результат - поврежденный файл. STL имеет версию ASCII;который у меня работает. Поэтому я предполагаю, что что-то не так с генерацией двоичного файла. Я хочу использовать двоичный файл для значительного уменьшения размера файла.

Я предполагаю, что выходной код будет выглядеть примерно так *:

import struct
    f = open('cool_filename.stl', 'wb')
    f.write(struct.pack(head, format=UINT8))
    f.write(struct.pack(num, format=UINT32))
    for i in range(0, num):
        f.write(struct.pack(normal, format=REAL32))
        f.write(struct.pack(vert1, format=REAL32))
        f.write(struct.pack(vert2, format=REAL32))
        f.write(struct.pack(vert3, format=REAL32))
        f.write(struct.pack(attr, format=UINT16))
    f.close()

Полезные ссылки:

struct.pack docs

спецификации формата

Я думаю, что ответ можно найти в последней ссылке выше, но я не совсем понимаю, какиспользуй это. После этого я попытался использовать struct.pack(I32, DATA) для форматирования 32-байтовых разделов без знака и аналогичного кода для остальных, но это не работает.

* Следует отметить, что это не работает,Код здесь, чтобы показать изменения формата

1 Ответ

0 голосов
/ 30 октября 2019

Первый аргумент struct.pack должен быть строкой, а спецификация формата I подразумевает 32 бита (размер = 4 в таблице в документе означает 4 байта, то есть 4 * 8 = 32 бита), поэтомунаписать одно 32-разрядное целое число без знака (скажем, 4711) в порядке байтов с прямым порядком байтов, вы бы сделали struct.pack('<I', 4711).

...