Записать двоичный массив в виде битов в файл - PullRequest
0 голосов
/ 10 июля 2020

У меня есть двоичный массив np ниже:

arr = [0. 0. 1. ... 0. 1. 1.]

Я хотел бы записать его в файл bin (имя выходного файла - test.bin). Я попытался использовать такую ​​команду:

arr.astype('int8').tofile('test.bin')

Но я обнаружил, что каждое значение в arr преобразуется в 8 бит. Я не хочу использовать 8 бит для представления одного числа, потому что мне нужно сделать Тест на случайность NIST sp800-22, входной файл должен быть файлом bin. Не могли бы вы дать мне несколько советов, чтобы я мог использовать один бит в файле bin для представления одного числа в arr?

Спасибо

Ответы [ 2 ]

0 голосов
/ 10 июля 2020

наименьшие блоки памяти - байты. Так что вообще не стоит этого делать. Однако, если вы настаиваете, вот уловка, чтобы сделать это:

import struct
with open("test.bnr", "wb") as f:
    for i in range(0,len(arr),8):
        bin_array = struct.pack('Q', int(''.join(arr[i:i+8].astype(str)), base=2))
        f.write(bin_array)

Преобразуйте ваш список в строки длиной 8 байтов, а затем преобразуйте строки в одинарные беззнаковые двойные и запишите их в файл. Это сохранит его до ближайших кратных 8 байтов. Конечно, вы можете сделать это с другими типами данных (одиночные байты, ints = 4bytes, ...) для ближайших кратных, которые вам нужны.

0 голосов
/ 10 июля 2020

Он преобразуется в int8, потому что вы запросили это с помощью .astype ('int8'). Так что оставьте это, и все должно работать, как ожидалось.

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