Seite 1 von 1

Hexzahl als String

Verfasst: Montag 15. August 2005, 10:38
von antimicro
Hi,
hat einer eine Antwort auf folgendes Problemchen?

Um eine Prüfsumme zu berechnen muss ich mehrere Zahlen (Hex) byteweise addieren. Die Hexzahlen habe ich allerdings als Integer. Was mit byteweise Addition gemeint ist kann ich am besten anhand eines Beispiels erklären:

0x90 und 0x06 => 0x96 :?

jetzt möchte ich die Zahlen von 0x90 in "0x90" (Integer -> String) umwandeln um dann die einzelnen Stellen zu addieren. Hat da jemand eine Idee oder gibts da was Eleganteres?

Dank im Voraus! :roll:

edit: kleiner Rechtschreibfehler

Verfasst: Montag 15. August 2005, 10:50
von CM
Wo genau ist das Problem? Wieso geht das

Code: Alles auswählen

hex(0x90 + 0x06)
#oder
hex(144 + 6)
nicht?

Gruß,
Christian

Verfasst: Montag 15. August 2005, 11:06
von rayo
mhhh vielleicht meint er

Code: Alles auswählen

0x90|0x06 == 0x96
0x82|0x02 == 0x82
also ne or-verknüpfung

Gruss

Verfasst: Montag 15. August 2005, 11:10
von CM
Hm, kann natürlich auch sein - aber auch dafür muß man nicht in einen String umwandeln. Also, antimicro, kannst Du uns vielleicht noch auf die Sprünge helfen? Oder hat rayo gut geraten?

Gruß,
Christian

Verfasst: Montag 15. August 2005, 14:04
von Joghurt
Vielleicht meint er auch BCDs?
0x99 + 0x05 = 0x104

Also, antimicro, dein Input ist gefragt!

Verfasst: Montag 15. August 2005, 14:25
von antimicro
Eigentlich ganz einfach...
die Zahlen 0x54 und 0x43 und 0x32 möchte ich 'byteweise addieren'.

0x54
0x43
0x32

dann zähle ich 0x4+0x3+0x2 = 0x9
und zum Schluss 0x9 + 0x50 + 0x40 + 0x30 = C9

dann ist mein Ergebnis 0xC909, alles klar?

Verfasst: Montag 15. August 2005, 16:52
von rayo
ne jetzt bin ich komplett verwirrt :D
die Zahlen 0x54 und 0x43 und 0x32 möchte ich 'byteweise addieren'.

0x54
0x43
0x32

dann zähle ich 0x4+0x3+0x2 = 0x9
und zum Schluss 0x9 + 0x50 + 0x40 + 0x30 = C9
bis hierhin ok.
dann ist mein Ergebnis 0xC909, alles klar?
woher kommt 0x..09, von der ersten berechung?


so wäre die berechnung, aber ich seh keinen sinn dahinter.

Code: Alles auswählen

tmp = 0x54+0x43+0x32
erstes = tmp&0x0F
zeites = tmp

resultat = (zweites<<8)+erstes
gruss

Verfasst: Montag 15. August 2005, 23:09
von BlackJack
Vielleicht hilft folgendes: Hex-, Dezimal und römische Zahlen sind einfach nur Darstellungen von ganzen Zahlen. Ob Du die Zahlen als Hex, Dezimal oder römisch hinschreibst und addierst ändert nichts am Ergebnis.

Wenn das Ergebnis einfach nur die Summe aller Zahlen auf ein Byte, also einen Wert zwischen 0 und 255 beschränt, sein soll, dann tut's folgendes:

Code: Alles auswählen

def byte_sum(iterable):
  return sum(iterable) & 0xFF

Verfasst: Dienstag 16. August 2005, 07:31
von antimicro
Hi,
das von rayo is es. Verstanden hab ich es zwar noch nicht, aber es funktioniert :) vielen dank.

Das ist für eine 16bit Prüfsumme. Ich verstehe das auch noch nicht warum da nicht z.B. CRC16 benutzt wird. Ach ja.... :?

Verfasst: Dienstag 16. August 2005, 16:56
von Joghurt
antimicro hat geschrieben:Hi,
das von rayo is es. Verstanden hab ich es zwar noch nicht, aber es funktioniert :) vielen dank.

Das ist für eine 16bit Prüfsumme. Ich verstehe das auch noch nicht warum da nicht z.B. CRC16 benutzt wird. Ach ja.... :?
Ein Byte = 8 Bit = 2 Hexadezimalstellen.

Was du meintest, war 1 Hexadezimalstelle, also 4 Bits, die heißen Nibble (oder Nybble), nicht Byte!