Python 24 bit Stream geeft geen juiste waarde?

Ik converteer 3 letters naar hun ASCII-binaire notatie en verhoog vervolgens de eerste letter met 16 plaatsen, de tweede met 8 plaatsen en de laatste met de plaats waar deze zich bevindt, zodat wanneer de 24-bits stream is geconfigureerd, de eerste 8 bit plaatsen staat voor de eerste letter, de volgende 8 voor de middelste letter en de laatste voor de laatste letter. Hier is mijn 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'

Dus dat is waar het probleem is, de eerste letter werd gedecodeerd als O , de laatste letter was correct evenals y , maar om de een of andere reden zal het niet het goede doen ding voor z . Wat is er mis?

2

3 antwoord

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)))

Zoals aangegeven in het antwoord van warvariuc , helpt Python's struct-module met het beheren van het inpakken en uitpakken van records van verschillende vormen, maar op dit punt in je leerproces van Python en van coderingssystemen in het algemeen, wil je waarschijnlijk vasthouden aan expliciete bit-wise manipulatie.

1
toegevoegd

Looks like you're missing an & 0xff:

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

levert het juiste antwoord op. Bij het terugschakelen moet je ook de hogere bits maskeren, omdat de bits die zijn ingesteld door het eerste karakter (verschoven met 16 bit) er nog steeds zijn.

1
toegevoegd
>>> 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
toegevoegd