Daten Binär ausgeben

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Benutzeravatar
Sr4l
User
Beiträge: 1091
Registriert: Donnerstag 28. Dezember 2006, 20:02
Wohnort: Kassel
Kontaktdaten:

Daten Binär ausgeben

Beitragvon Sr4l » Mittwoch 30. Mai 2007, 18:48

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?
BlackJack

Beitragvon BlackJack » Mittwoch 30. Mai 2007, 19:15

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'.
Grossmeister_C
User
Beiträge: 36
Registriert: Montag 26. Februar 2007, 15:53

Beitragvon Grossmeister_C » Mittwoch 30. Mai 2007, 19:16

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.
Benutzeravatar
Sr4l
User
Beiträge: 1091
Registriert: Donnerstag 28. Dezember 2006, 20:02
Wohnort: Kassel
Kontaktdaten:

Beitragvon Sr4l » Mittwoch 30. Mai 2007, 19:25

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?
BlackJack

Beitragvon BlackJack » Mittwoch 30. Mai 2007, 20:00

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.
Grossmeister_C
User
Beiträge: 36
Registriert: Montag 26. Februar 2007, 15:53

Beitragvon Grossmeister_C » Mittwoch 30. Mai 2007, 20:05

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.
pythonist
User
Beiträge: 40
Registriert: Sonntag 14. Mai 2006, 17:28

Beitragvon pythonist » Mittwoch 30. Mai 2007, 21:14

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
BlackJack

Beitragvon BlackJack » Mittwoch 30. Mai 2007, 21:31

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
Benutzeravatar
Sr4l
User
Beiträge: 1091
Registriert: Donnerstag 28. Dezember 2006, 20:02
Wohnort: Kassel
Kontaktdaten:

Beitragvon Sr4l » Donnerstag 31. Mai 2007, 08:23

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.
BlackJack

Beitragvon BlackJack » Donnerstag 31. Mai 2007, 08:40

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.
Benutzeravatar
Sr4l
User
Beiträge: 1091
Registriert: Donnerstag 28. Dezember 2006, 20:02
Wohnort: Kassel
Kontaktdaten:

Beitragvon Sr4l » Donnerstag 31. Mai 2007, 11:38

Ich will zwischen durch immer mal alles in Python machen und nicht auf 3te Hersteller zurückgreifen ;-)
BlackJack

Beitragvon BlackJack » Donnerstag 31. Mai 2007, 13:32

Hm, ein Hexeditor in Python wäre vielleicht eine nette Projektidee. :-)
Benutzeravatar
HWK
User
Beiträge: 1295
Registriert: Mittwoch 7. Juni 2006, 20:44

Beitragvon HWK » Donnerstag 31. Mai 2007, 17:47

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

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder