2017-01-15 4 views
2

Als Teil eines größeren Projekts möchte ich eine Bitfolge in einer Datei speichern, so dass die Datei so klein wie möglich ist. Ich spreche nicht über Komprimierung, ich möchte die Sequenz so speichern, wie sie ist, aber mit der geringsten Anzahl an Zeichen. Die ursprüngliche Idee war, Mini-Sequenzen von 8 Bit in Zeichen mit ASCII-Codierung zu verwandeln und diese Zeichen zu speichern, aber aufgrund eines unbekannten Problems mit seltsamen Zeichen sind die beim Lesen der Datei abgerufenen Zeichen nicht dieselben wie ursprünglich geschrieben. Ich habe versucht, die Datei mit utf-8-Codierung, Latin-1 zu öffnen, aber keiner scheint zu funktionieren. Ich frage mich, ob es noch einen anderen Weg gibt, vielleicht, indem ich die Sequenz in eine hexadezimale Zahl umwandle?Übergeben einer Bitfolge an eine Datei python

+0

Beachten Sie, dass ASCII nur 7 Bits hat. Das höchste Bit (sozusagen Bit 8) wird immer auf Null gesetzt. –

+3

Warum speichern Sie sie als Text überhaupt? Öffnen Sie die Datei im Binärmodus.Wenn die Bits nicht ein Vielfaches von acht sind, müssen Sie ein zusätzliches Byte die Anzahl der gültigen Bits in dem letzten Byte zu beschreiben, aber ansonsten würde man nur die rohen Bytes speichern, nicht in einer bestimmten Codierung. – ShadowRanger

+1

Ja, Sie müssen sie im Binärmodus verwenden. Hier ist eine Seite, die über Bit-Arrays in Python spricht: https://wiki.python.org/moin/BitArrays. –

Antwort

0

technisch können Sie nicht schreiben weniger als ein Byte, da das Betriebssystem Speicher in Bytes (write individual bits to a file in python) organisiert, so ist dies Binärdatei io finden https://docs.python.org/2/library/io.html gibt es Module wie struct

öffnen Sie die Datei mit dem 'b' Schalter zeigt binäre Lese-/Schreiboperation, verwenden also die to_bytes() Funktion (Writing bits to a binary file) oder struct.pack() (How to write individual bits to a text file in python?)

with open('somefile.bin', 'wb') as f: 

import struct 
>>> struct.pack("h", 824) 
'8\x03' 

>>> bits = "10111111111111111011110" 
>>> int(bits[::-1], 2).to_bytes(4, 'little') 
b'\xfd\xff=\x00' 

, wenn Sie um das 8-Bit (Byte) Struktur des Speichers erhalten möchten, können Sie Bit-Manipulations und Techniken wie Bitmasken und BitArrays verwenden siehe https://wiki.python.org/moin/BitManipulation und https://wiki.python.org/moin/BitArrays

aber das Problem ist, Wie Sie gesagt haben, um die Daten zu lesen, wenn Sie BitArrays unterschiedlicher Länge verwenden dh, um eine Dezimalzahl 7 zu speichern, benötigen Sie 3 Bit 0x111, um eine Dezimalzahl 2 zu speichern, benötigen Sie 2 Bit 0x10. jetzt ist das Problem, dies zurück zu lesen. Wie kann Ihr Programm wissen, ob es den Wert als 3-Bit-Wert oder als 2-Bit-Wert zurücklesen muss? im unorganisierten Speicher die Sequenz Dezimal 72 sieht aus wie 11110, die übersetzt in 111|10 so Wie kann Ihr Programm wissen, wo die | ist?

in normalen Byte Speicher dezimal bestellt 72 0000011100000010 ->00000111|00000010 dies den Vorteil, dass es klar ist, wo die |

ist

aus diesem Grunde auf dem niedrigsten Stand Speicher in festen Gruppen von 8 Bit organisiert ist = 1 Byte. Wenn Sie auf einzelne Bits innerhalb eines Bytes/8-Bit-Clusters zugreifen möchten, können Sie Bitmasken in Kombination mit logischen Operatoren (http://www.learncpp.com/cpp-tutorial/3-8a-bit-flags-and-bit-masks/) verwenden. in Python ist der einfachste Weg für einzelne Bit-Manipulations das Modul ctypes

, wenn Sie wissen, dass Ihre Werte sind alle 6 Bit vielleicht ist es die Mühe wert, aber auch dies ist hart ...

(How do you set, clear, and toggle a single bit?)

(Why can't you do bitwise operations on pointer in C, and is there a way around this?)

+0

Vielen Dank für Ihre Hilfe, aber wir haben versucht, diejenigen, Methoden und was wir in unserer Datei fertig geschrieben haben, war ein bisschen wie ein Saibling. Vielleicht ist die Frage nicht gut gestellt, wir wollen den optimalen Container für diese Bits finden, um mit möglichst geringer Größe in eine Datei geschrieben zu werden. Ist das möglich? Wir haben versucht, alle 7 Bits zu nehmen und in einen Char zu verwandeln, aber als wir versuchten, die ursprüngliche Sequenz wiederherzustellen, führte dies zu Fehlern ... –

Verwandte Themen