Seite 1 von 1

Daten Binär ausgeben

Verfasst: Mittwoch 30. Mai 2007, 18:48
von Sr4l
Hallo ich habe folgenden Code um eine belibige Datei einzulesen und in HEX auszugeben (hier jetzt eine TIF Datei)

Code: Alles auswählen

#!/usr/bin/python

x = file('l.tif','r')
r = x.read()

print r.encode("HEX")
Meine Frage jetzt wie kann ich das ganze binär lesen und später auch einmal schreiben?

http://docs.python.org/lib/standard-encodings.html
Konnte hier nichts finden. ist das in anderen Modueln untergebracht?

Verfasst: Mittwoch 30. Mai 2007, 19:15
von BlackJack
Du musst die Datei im Binärmodus öffnen:

Code: Alles auswählen

f = open('bla.tiff', 'rb')
data = f.read()
f.close()
Schreiben geht analog mit dem Modus 'wb'.

Verfasst: Mittwoch 30. Mai 2007, 19:16
von Grossmeister_C

Code: Alles auswählen

fd = file('image.jpg', 'rb')
data = fd.read()
print data.encode("HEX")


Naja und für das binäre schreiben dann halt 'wb' angeben.

Verfasst: Mittwoch 30. Mai 2007, 19:25
von Sr4l
Danke die modis rb wb kenn ich aber wenn ich den outout printe wird es icht als 0 und 1 dargestellt. versucht es in allen möglichen sonderzeichen.

ausserdem habe ich gelesen das der rb bzw. wb gegenüber normal r und w modus unter linux keinen unterschied macht. stimmt das?

Verfasst: Mittwoch 30. Mai 2007, 20:00
von BlackJack
Ach *das* meinst Du mit binär. Das musst Du selber programmieren.

Das 'b' macht unter Linux zwar keinen Unterschied, aber man sollte es trotzdem benutzen. Es funktioniert dann auch unter anderen Betriebssystemen und dient auch der Dokumentation. Wert das liest, weiss gleich das es sich nicht um eine Textdatei handelt.

Verfasst: Mittwoch 30. Mai 2007, 20:05
von Grossmeister_C
Sr4l hat geschrieben:Danke die modis rb wb kenn ich aber wenn ich den outout printe wird es icht als 0 und 1 dargestellt. versucht es in allen möglichen sonderzeichen.

Darf ich mal fragen zu welchem Zweck Du das unbedingt als 0 und 1 ausgegeben haben mußt ? Ist mir gerade nicht wirklich ersichtlich.

Verfasst: Mittwoch 30. Mai 2007, 21:14
von pythonist
Abend,

ich hab dir mal was gebastelt das Ganze wandelt die Datei nach der Divisionsmethode in Binär um. Ist extrem langsam aber funktioniert.

Viel Spaß damit:

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: utf-8 -*-

def hex2bin(hexstr):
    #Hex-String in Int umwandeln
    i = int("0x" + hexstr, 0)
    
    #Leere List für die 1 und 0
    b = []
    
    #Immer die Zahl von die dann ausgegangen wird am anfang i
    n = i
    
    #Endlosschleife
    while True:
        #Modulo am Anfang einfügen
        b.insert(0, str(n % 2))
        
        #Neuen n errechnen
        n /= 2
        
        #Wenn n 0 ist abbrechen
        if n == 0:
            break
    #List als String zurückgeben
    return "".join(b)

#Logisch oder?
f = open("l.tif","r")
print hex2bin(f.read().encode("hex"))
pythonist

Verfasst: Mittwoch 30. Mai 2007, 21:31
von BlackJack
Den Zwischenschritt mit der Hex-Kodierung solltest Du weglassen und die Bytes einzeln umwandeln. Und am besten mit `list.append()` arbeiten und das (Zwischen)-Ergebnis dann umdrehen. Das sollte schneller sein, als vorne in eine Liste einzufügen.

Code: Alles auswählen

def byte2base2(byte):
    result = list()
    for dummy in xrange(8):
        result.append(str(byte & 1))
        byte >>= 1
    return ''.join(reversed(result))


def main():
    data = '\0\xff\x55\xaa'
    print ' '.join(byte2base2(ord(c)) for c in data)
Ausgabe: 00000000 11111111 01010101 10101010

Verfasst: Donnerstag 31. Mai 2007, 08:23
von Sr4l
Danke.

Ich dachte halt nur das es soetwas schon irgend wo include gibt ;-)

Der Sinn ist folgender, ich möchte Binärdatein für mich als Menschen lessbar machen und analysieren. Ich erzeuge eine Datei und mache sich wiederholende Muster, dann lese ich die Datei ein und versuche diese Muster wieder zu finden. Dadurch erhoffe ich mir die Art der Speicherung zuverstehen und die Daten auf Datei Ebene zu manipulieren ohne das Programm welches die Datein erzeugt zu nutzen.

Vll wird sich HEX dabei als besser als Binär erweisen, aber ich wollte halt beide Varianten ausprobieren.

Verfasst: Donnerstag 31. Mai 2007, 08:40
von BlackJack
Für so etwas gibt's eigentlich Hex-Editoren. Da hast Du in der Regel die Möglichkeit zwischen verschiedenen Darstellungen umzuschalten oder das Byte (und die folgenden) gleichzeitig als Byte, Word, Long, Float, Double etc. angezeigt zu bekommen.

Verfasst: Donnerstag 31. Mai 2007, 11:38
von Sr4l
Ich will zwischen durch immer mal alles in Python machen und nicht auf 3te Hersteller zurückgreifen ;-)

Verfasst: Donnerstag 31. Mai 2007, 13:32
von BlackJack
Hm, ein Hexeditor in Python wäre vielleicht eine nette Projektidee. :-)

Verfasst: Donnerstag 31. Mai 2007, 17:47
von HWK
Wenn es auf's Tempo ankommt, kann man die 256 möglichen unterschiedlichen Binärstrings eines Bytes einmal in einer Liste speichern. Dann braucht man zum Umwandeln jedes Bytes dieses dann nur noch als Index für die Liste verwenden.
MfG
HWK