bytestring bzw. bytearray to int (signed / unsigned)
Verfasst: Freitag 24. Januar 2020, 20:57
Hallo,
ich habe folgende Aufgabe.
Ich bekomme einen Bytestring bzw. eine bytearray wie bspw a = bytearray(b'G\xc3\x00\x00'
Darin sind integer Werte verpackt. Die Codierung ist: (Wert des ersten Byte in Dec* x 256^0) + (Wert des zweiten Byte in Dec x 256^1) + (Wert des dritten Byte in Dec x 256^3) + usw.
Die Ergebnisse können signed oder unsigned sein. Ich weiß, welcher Werte signed sind und welche unsigned.
Bislang habe ich das so gelöst.
Das geht bestimmt auch besser. Habt ihr Ideen?
ich habe folgende Aufgabe.
Ich bekomme einen Bytestring bzw. eine bytearray wie bspw a = bytearray(b'G\xc3\x00\x00'
Darin sind integer Werte verpackt. Die Codierung ist: (Wert des ersten Byte in Dec* x 256^0) + (Wert des zweiten Byte in Dec x 256^1) + (Wert des dritten Byte in Dec x 256^3) + usw.
Die Ergebnisse können signed oder unsigned sein. Ich weiß, welcher Werte signed sind und welche unsigned.
Bislang habe ich das so gelöst.
Code: Alles auswählen
def decode_rawvalue(self, rawdatabytes, commandsignage):
byteindex = 0
rawvalue = 0
while (len(rawdatabytes) > 0):
# Erstes Byte zwischenspeichern
leftbyte = rawdatabytes[:1]
# Wert des Bytes ermitteln
value = int(ord(leftbyte))
# Gewichten / Multiplizieren
if (byteindex > 0):
value = int(value * pow(256, byteindex))
# Aufaddieren der einzelnen Bytes
rawvalue = rawvalue + value
# Byteindex hochzählen, damit das Byte mit entsprechend mit 1, 256, 65536, 16777216, usw. multipliziert werden kann
byteindex = byteindex + 1
# Bytestring um das erste Byte verkürzen
rawdatabytes = rawdatabytes[1:]
# Signed/Unsigned berücksichtigen
if (commandsignage == 'signed'):
if ((byteindex == 1) and (rawvalue > 127)):
rawvalue = (256 - rawvalue) * (-1)
elif ((byteindex == 2) and (rawvalue > 32767)):
rawvalue = (65536 - rawvalue) * (-1)
#elif ((byteindex == 4) and (rawvalue > 2147483647)):
# rawvalue = (4294967296 - rawvalue) * (-1)
return rawvalue