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
Antwort
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 |
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?)
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 ... –
- 1. PHP-Variablen an eine enthaltene Datei übergeben?
- 2. Eine Python-Liste an php übergeben
- 3. Die längste Nullsequenz in einer Bitfolge finden
- 4. Kopie einer Liste an eine Funktion in Python übergeben
- 5. Modulfunktion an eine Funktion in einer anderen Datei übergeben
- 6. Übergeben einer statischen HTML-Formulardaten an eine ASPX-Datei
- 7. Strings an eine make-Datei übergeben
- 8. Passen Sie eine Bitfolge in einer Zahl an und konvertieren Sie dann die Übereinstimmung in Nullen?
- 9. PHP: Übergeben Sie eine Datei an eine USER definierte Funktion
- 10. Übergeben einer Zeichenfolge an file.open();
- 11. Übergeben Sie eine Python-Liste an eine Django-Vorlage
- 12. Übergeben einer Zeichenfolge an eine modale Ansicht
- 13. Übergeben einer Modelleigenschaft an eine Teilansicht
- 14. CakePHP: Übergeben einer Variablen an eine Ansicht
- 15. Eine Variable übergeben - Python
- 16. Python-Argument an Shell übergeben
- 17. Integer-Listen an Python übergeben
- 18. Python: egrep-Ausgabe an eine Datei anhängen
- 19. Wie werden benannte Parameter an eine Batch-Datei übergeben?
- 20. Eine Flagge an eine andere Funktion übergeben?
- 21. Python: Wie Liste als Parameter an eine Funktion übergeben?
- 22. Übergeben von Parametern an eine andere Bash-Datei mit Leerzeichen
- 23. C++ Übergabe einer Datei an eine Zeichenfolge
- 24. Übergeben an Python-Methode basierend auf der Länge einer Liste
- 25. Übergeben einer Python-Liste von Zeichenfolgen an Applescript?
- 26. Php Laravel 5.3 Übergeben eines Eingabewerts von einer Blade-Datei an eine andere Blade-Datei
- 27. Was ist der beste Weg, Variablen aus einer node.js-Datei an eine andere Datei zu übergeben?
- 28. Übergeben einer Datei an POST-Anfrage in Play Framework
- 29. Python-Multiprozessing - Übergeben einer Liste von Dicts an einen Pool
- 30. Wie übergeben Argument an PuTTY-Befehle Datei
Beachten Sie, dass ASCII nur 7 Bits hat. Das höchste Bit (sozusagen Bit 8) wird immer auf Null gesetzt. –
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
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. –