mikrocontroller.net

Forum: PC-Programmierung Python: Seltsames Verhalten beim Schreiben von Binary


Autor: Tim (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
ich versuche gerade Binary-Daten in Python 2.7 zu schreiben. Dabei setze 
ich die Daten erst in einem String zusammen und wandel diese dann mit 
binascii um.
Das funktioniert auch fast immer. Aber nun bin ich ratlos.

Bei einer bestimmten String-Kombination wird 0x 0D eingefügt. Den Grund 
verstehe ich aber nicht.

Im Hex-Editor lese ich dann 7 Byte (bc 20 01 20 20 0d 0a) anstatt wie 
geplant 6 Byte. Wenn ich die Bin-Daten mit python auslese, sehe ich aber 
auch nichts von 0x 0D. Nur eben im Hex-Editor und damit vielleicht auch 
in einer anderen Software.

Was hat es damit auf sich?
# -*- coding: utf-8 -*-
import sys
import os.path
import binascii

   #h_block_sum = "012345" #working example
   h_test = "bc000100000abc000100000a"  # writes bc000100000d0abc000100000d0a in file ???
   #h_block_sum = "bc000100001abc000100000a" # writes bc000100000abc000100000d0a in file ???
   hb=binascii.a2b_hex(h_test)
   
   try:
      outputfile = open('test.txt', 'w')
      outputfile.write(hb)
   finally:
      outputfile.close()
      
   # test content in python
   inputfile = open('test.txt', 'r')
   block = inputfile.read(20)
   str1 = ""
   for ch in block:
      str1 += hex(ord(ch))+" "
   print("Reading Test-Data: "+str1)
   inputfile.close()

Autor: joe (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wird als Textdatei behandelt. Da wird LF automatisch CRLF.

Mach mal open( ..., "wb")); bei C geht das.

Grüße Joe

Autor: Tom (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dein 0x0a ist ein \n. Wenn ein Zeilenumbruch in eine Datei im Textmodus 
geöffnete Datei geschrieben wird, wird er (unter Windows) automatisch in 
\r\n (0x0d 0x0a) umgewandelt.

Autor: c.m. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
https://www.google.de/search?q=python+file+open+binary
# Read the entire file as a single byte string
with open('somefile.bin', 'rb') as f:
    data = f.read()

# Write binary data to a file
with open('somefile.bin', 'wb') as f:
    f.write(b'Hello World')

eventuell ist der öffnungsmodus ("wb") die lösung, aber ich kenne python 
nicht - ist also nur ins blaue geschätzt.

Autor: Kaj (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn du eine Datei binär interpretiert möchtest, dann musst du diese 
auch binär öffnen.

Aus der Doku:

https://docs.python.org/2/library/functions.html#open
The default is to use text mode, which may convert '\n' characters to a
platform-specific representation on writing and back on reading. Thus, when
opening a binary file, you should append 'b' to the mode value to open the
file in binary mode, which will improve portability.

Autor: Tim (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dank an alle!
So einfach also. Hatte gar nicht mehr daran gedacht, dass der noch 
binary-Daten anfasst.

Öffnen mit 'wb' war die Lösung.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.