كيف يمكنني فك عرافة ثنائي تنسيق البيانات في بيثون؟

StackOverflow https://stackoverflow.com/questions/200738

  •  03-07-2019
  •  | 
  •  

سؤال

وباستخدام PHP حزمة () وظيفة، لقد بتحويل سلسلة إلى تمثيل ثنائي عرافة:

$string = md5(time); // 32 character length
$packed = pack('H*', $string);

ووH * التنسيق يعني "عرافة سلسلة، وارتفاع عاب أولا".

لفك هذا في PHP، وأود أن مجرد استخدام فك () وظيفة مع تنسيق * H العلم.

وكيف لي أن فك هذه البيانات في بيثون؟

هل كانت مفيدة؟

المحلول

وهناك طريقة سهلة للقيام بذلك مع وحدة binascii:

>>> import binascii
>>> print binascii.hexlify("ABCZ")
'4142435a'

واذا لم اكن سوء فهم شيء حول ترتيب عاب (عالية عاب الأول هو الافتراضي)، التي ينبغي أن تكون كافية تماما!

وعلاوة على ذلك، والأشياء hashlib.md5 بايثون لديها طريقة hexdigest() لتحويل تلقائيا MD5 هضم إلى سلسلة عرافة ASCII، بحيث أن هذا الأسلوب ليس من الضروري حتى لMD5 هضم. نأمل أن يساعد.

نصائح أخرى

وليس هناك المقابلة "عرافة عاب" رمز لstruct.pack، لذلك عليك إما تحتاج إلى حزمة يدويا إلى بايت لأول مرة، مثل:

hex_string = 'abcdef12'

hexdigits = [int(x, 16) for x in hex_string]
data = ''.join(struct.pack('B', (high <<4) + low) 
               for high, low in zip(hexdigits[::2], hexdigits[1::2]))

وأو أفضل، يمكنك فقط استخدام الترميز عرافة. أي.

>>> data = hex_string.decode('hex')
>>> data
'\xab\xcd\xef\x12'

لفك، يمكنك تشفير النتيجة مرة أخرى إلى عرافة بالمثل

>>> data.encode('hex')
'abcdef12'

ولكن، لاحظ أن على سبيل المثال، فإن هناك ربما لا حاجة لاتخاذ ذهابا وإيابا من خلال تمثيل عرافة على الإطلاق عند ترميز. مجرد استخدام ثنائي MD5 هضم مباشرة. أي.

>>> x = md5.md5('some string')
>>> x.digest()
'Z\xc7I\xfb\xee\xc96\x07\xfc(\xd6f\xbe\x85\xe7:'

وهذا يعادل حزمة الخاص بك () إد التمثيل. للحصول على تمثيل عرافة، استخدم نفس طريقة فك أعلاه:

>>> x.digest().decode('hex')
'acbd18db4cc2f85cedef654fccc4a4d8'
>>> x.hexdigest()
'acbd18db4cc2f85cedef654fccc4a4d8'

[تحرير]: تحديث لاستخدام أفضل طريقة (عرافة الترميز)

في بيثون استخدام البنية وحدة لذلك.

>>> from struct import *
>>> pack('hhl', 1, 2, 3)
'\x00\x01\x00\x02\x00\x00\x00\x03'
>>> unpack('hhl', '\x00\x01\x00\x02\x00\x00\x00\x03')
(1, 2, 3)
>>> calcsize('hhl')
8

وHTH

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top