Python 24 Bit Stream gibt keinen richtigen Wert?

Ich konvertiere 3 Buchstaben in ihre ASCII-Binärnotation und inkrementiere dann den ersten Buchstaben um 16 Stellen, den zweiten Buchstaben um 8 Stellen, und die letzte bleibt wo sie ist, so dass, wenn der 24-Bit-Strom konfiguriert ist, die ersten 8 Bit Orte stellen den ersten Buchstaben dar, die nächsten 8 den mittleren und der letzte den letzten Buchstaben. Hier ist mein Code:

# create a block for the word 'Ozy'
bk1 = (ord('O')<<16) + (ord('z')<<8) + (ord('y'))
# Now take off the encryption for the block
cbk1 = ((chr(bk1>>16)) + (chr(bk1>>8)) + (chr(bk1&0xFF)))
# output of cbk1 is: 'O\u4f7ay'

Also das ist, wo das Problem ist, der erste Buchstabe wurde als O entschlüsselt, der letzte Buchstabe war korrekt sowie y , aber aus irgendeinem Grund wird es nicht das Recht tun Ding für z . Was ist los mit dir?

2

3 Antworten

This happens because you forgot to filter-out the bits from the first letter!
Indeed the ASCII value for the 2nd letter, 'z', shows as '7a', but as you see it has '4f' (i.e. the ASCII for 'O'), in front of it. Try something like:
cbk1 = ((chr(bk1>>16)) + (chr((bk1 & 0xFF00)>>8) ) + (chr(bk1&0xFF)))

Wie in der Antwort von warvariuc gezeigt, hilft das Strukturmodul von Python dabei, das Packen und Entpacken von Datensätzen verschiedener Form zu verwalten, aber an dieser Stelle möchten Sie wahrscheinlich von Python und von Kodierungssystemen lernen bei expliziter bitweiser Manipulation bleiben.

1
hinzugefügt

Looks like you're missing an & 0xff:

cbk1 = ((chr(bk1>>16)) + (chr((bk1>>8) & 0xff)) + (chr(bk1&0xFF)))

ergibt die richtige Antwort. Beim Zurückschalten müssen auch die oberen Bits ausgeblendet werden, da die vom ersten Zeichen gesetzten Bits (um 16 Bit verschoben) immer noch da sind.

1
hinzugefügt
>>> import struct
>>> a = chr(0) + 'Ozy' # make the data 4 byte long
>>> x = struct.unpack('>I', a)[0] # convert byte data into unsigned integer of 4 bytes
>>> hex(x) # it should be 3 bytes long, because first byte was 0x00
'0x4f7a79'
>>> a = struct.pack('>I', x)[1:] # pack the integer back to bytes and throw away the left most 0x00 byte
>>> a
'Ozy'
>>> 
0
hinzugefügt