Hallo, ein Kollege von mir versucht ein paar Delphi Codeschnipsel in Python umzusetzen. Da ich selber keine Ahnung von Python habe, suche ich hier nach Tipps, die ich weitergeben kann. Der Kollege sagte mir, das es in Python den Datentyp byte nicht gibt, wohl aber Bytearray. Es geht um eine Checksummenberechnung (Nullsumme). In Delphi / Pascal sieht das folgendermaßen aus: procedure sendestring(s:string); // hänge an Sting s eine Checksumme an und sende das raus var c : byte; i : integer; begin // s := 'Hello World'; // Beispieltext c := 0; // Anfangswert der Checksumme for i := 1 to length(s) do c := c - ord(s[i]); // die Ascii-codes nacheinander subtrahieren s := s + char(c); // und dann an den String anhängen sende(s); // String + Checksumme senden end; Die Checksumme kann dann folgendermaßen geprüft werden: function checkechecksumm(s:string):boolean; var c : byte; i : integer; begin c := 0; // Anfangswert auf 0 for i := 1 to length(s) do c := c + s[i]; // alle Bytes addieren result := (c = 0); // wenn Summe = 0, dann ok end; So wie ich das verstanden habe, kann ich in Python nicht mit Bytes rechnen, zumindest nicht mit einzelnen Bytes. Könnte ich aber dasselbe erreichen, wenn ich ein einzelnes Element aus einem Bytearray verwende? also ungefähr so: c = bytes([0]) # array mit nur einem Element c[0] = 0 for x in range (0,4) c[0] = c[0] - s[x] Gruß Stefan
Hallo Stefan, ohne konkrete Rechenbeispiele kann ich das nicht validieren ob’s da ggf. Probleme mit Vorzeichen gibt - aber fuer sowas reicht der Modulooperator eigentlich aus:
s = "hallo stefan" s + chr(sum(ord(c) for c in s) % 0xff) 'hallo stefan\xb5’
Diez
On 13 May 2015, at 10:52, Stefan <df9bi@arcor.de> wrote:
Hallo,
ein Kollege von mir versucht ein paar Delphi Codeschnipsel in Python umzusetzen. Da ich selber keine Ahnung von Python habe, suche ich hier nach Tipps, die ich weitergeben kann.
Der Kollege sagte mir, das es in Python den Datentyp byte nicht gibt, wohl aber Bytearray.
Es geht um eine Checksummenberechnung (Nullsumme).
In Delphi / Pascal sieht das folgendermaßen aus:
procedure sendestring(s:string); // hänge an Sting s eine Checksumme an und sende das raus var c : byte; i : integer; begin // s := 'Hello World'; // Beispieltext c := 0; // Anfangswert der Checksumme for i := 1 to length(s) do c := c - ord(s[i]); // die Ascii-codes nacheinander subtrahieren s := s + char(c); // und dann an den String anhängen sende(s); // String + Checksumme senden end;
Die Checksumme kann dann folgendermaßen geprüft werden:
function checkechecksumm(s:string):boolean; var c : byte; i : integer; begin c := 0; // Anfangswert auf 0 for i := 1 to length(s) do c := c + s[i]; // alle Bytes addieren result := (c = 0); // wenn Summe = 0, dann ok end;
So wie ich das verstanden habe, kann ich in Python nicht mit Bytes rechnen, zumindest nicht mit einzelnen Bytes. Könnte ich aber dasselbe erreichen, wenn ich ein einzelnes Element aus einem Bytearray verwende?
also ungefähr so:
c = bytes([0]) # array mit nur einem Element c[0] = 0
for x in range (0,4) c[0] = c[0] - s[x]
Gruß
Stefan
_______________________________________________ python-de maillist - python-de@python.org https://mail.python.org/mailman/listinfo/python-de
Am 13.05.2015 um 10:52 schrieb Stefan:
So wie ich das verstanden habe, kann ich in Python nicht mit Bytes rechnen, zumindest nicht mit einzelnen Bytes. Könnte ich aber dasselbe erreichen, wenn ich ein einzelnes Element aus einem Bytearray verwende?
Verwende statt dessen in Python 2 einfach einen String (str) und in Python 3 einen Bytestring (bytes). Beides sind so in etwa das gleiche, wie Arrays aus char in C. Bei str musst du, um den Bytewert eines Zeichen zu bekommen, ord(c) verwenden. Hier z.B. eine Checksummenberechnung für MIDI-Sysexdaten in Python 2: def checksum(data): sum = 0 for c in data: sum += ord(c) return sum & 0x7f In Python 3 muss, wenn data statt als str als bytes übergeben wird, ord() weggelassen werden, weil, wenn man über bytes iteriert, bekommt die einzelnen Elemente als int zurück. Das ist leider einer der Fälle, der es kompliziert macht, Code zu schreiben, der gleichzeitig mit Python 2 und 3 funktioniert. Chris
Stefan schrieb:
So wie ich das verstanden habe, kann ich in Python nicht mit Bytes rechnen, zumindest nicht mit einzelnen Bytes. Könnte ich aber dasselbe erreichen, wenn ich ein einzelnes Element aus einem Bytearray verwende?
Doch, in Python3 ist die Technik bytearray. Nach http://www.dotnetperls.com/bytes kann man bytearray konvertieren: initial = [100, 255, 255, 0] # Konvertiere Liste in bytearray b = bytearray(initial) # Konvertiere zurück result = list(b) Falls die binäre Daten in Dateien stehen, die Datei mir rb statt r bzw wb statt w öffnen Hermann der Python3 Python2 wegen Haltbarkeit der software vorzieht. -- http://www.Hermann-Riemann.de
participants (4)
-
Christopher Arndt -
Diez B. Roggisch -
Hermann Riemann -
Stefan