2013-10-26 5 views
2

Предположим, что у меня есть файл в качестве входных данных, что составляет 4 байта, и я хотел бы вывод:Биты и файлы в Python

bit + first two bytes + bit + last two bytes 

Где добавленные биты только флаги. Как я могу это сделать в python (используя только встроенные функции), так что новый файл имеет всего 5 байтов (2 бит + 4 байта ~ = 5 байтов).

Я знаком с file.read(x) и другими операциями ввода-вывода, но часть, о которой я не уверен, заключается в том, как добавить биты.

Редактировать: Я смог решить эту проблему, используя библиотеку python bitarray. Этот модуль имеет поддержку, чтобы сделать все, что я хотел:

  • Чтение байтов из файла в битовый массив, используя fromfile()
  • добавить биты с помощью append(True/False)
  • присоединяя переменную с определенного размера с помощью frombytes() и стандарт python struct модуль.
  • Запись битов массива в файл (с прокладкой, если это необходимо) с помощью tofile()

Вы также можете использовать python-bitstring модуль, чтобы получить аналогичные результаты.

+1

ли формат вывода уже предопределены (требование проекта), чтобы быть точно так же как это? Если это не так, я буду писать биты (флаги) полностью отдельно от части данных. –

+0

Да, мне нужно, чтобы перед данными были флаги. – Sam

+0

Я добавил свое решение в редактирование. пожалуйста, голосуйте заново. – Sam

ответ

1

Используйте модуль struct, чтобы упаковать бит и байты в строку, а затем записать его в файл.

+0

struct может работать, за исключением того, что все базовые типы все еще находятся в 1 байт, поэтому итоговый результат будет 6 байтов, что не то, что я хочу. Посмотрите http://docs.python.org/2/library/struct.html#format-characters – Sam

2

Вы должны использовать bit wise операторы

flag1 = 1 
flag2 = 1 
flag1 = flag1 
flag2 = flag2 << 17 # (2 bytes + 1 bit under it) 
byte1 = byte1 << 1 # (1 bit) 
byte2 = byte2 << 18 # (2 bytes + 2 bits underit) 

out = flag1 & flag2 & byte1 & byte2 # stack them up 
+0

Мне нужно будет сделать это для целого файла и добавить бит в произвольных местах. Каким будет этот масштаб? – Sam

+0

Осторожно. В сочетании с 'struct' для получения байтов в и из файлов. Не слишком сложно обобщить этот код. – tacaswell

Смежные вопросы