بايثون 24 بت دفق لا يعطي قيمة صحيحة؟

أقوم بتحويل 3 أحرف إلى تدوين ASCII الثنائي ومن ثم زيادة الحرف الأول بأربعة عشر مكانًا ، والحرف الثاني في 8 أماكن ، والأخير هو البقاء في مكانه ، بحيث يتم تكوين تدفق بت 24 بت ، أول 8 بتات أماكن تمثل الحرف الأول ، والثمانية التالية الحرف الأوسط والأخير يمثل الحرف الأخير. ها هي الكود:

# 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'

So thats where the problem is, the first letter was decrypted as O, the last letter was correct as well as y, but for some reason it won't do the right thing for z. What's wrong?

2

3 إجابة

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

كما هو موضح في إجابة warvariuc ، تساعد وحدة البنية في Python على إدارة التعبئة وتفريغ السجلات ذات الأشكال المختلفة ، ولكن في هذه المرحلة من تعلمك عن Python وأنظمة التدوين بشكل عام ، ربما تريد التمسك بالتلاعب الصريح

1
وأضاف

Looks like you're missing an & 0xff:

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

يعطي الجواب الصحيح. عند إعادة التراجع ، تحتاج إلى إخفاء الأجزاء العليا أيضًا لأن البتات التي تم تعيينها بواسطة الحرف الأول (تم تغييرها بمقدار 16 بت) ستظل موجودة.

1
وأضاف
>>> 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
وأضاف