أحرف غير ثنائية (HEX) في السلسلة المستلمة على TCP مع Python
-
29-09-2019 - |
سؤال
ربما هذا سؤال noob ، لكنني أتلقى بعض البيانات عبر TCP وعندما أنظر إلى السلسلة أحصل على ما يلي:
\x00\r\xeb\x00\x00\x00\x00\x01t\x00
ما هذا \r
الشخصية وماذا يفعل t
في \x01t
يعني؟
لقد جربت Googling ، لكنني لست متأكدًا مما يجب على Google لـ ...
شكرًا.
المحلول
قد يكون عرض البيانات الثنائية في الأوتار أمرًا مربكًا في بعض الأحيان ، خاصةً إذا كانت طويلة ، ولكن يمكنك دائمًا تحويلها إلى بعض السداسي السحرية.
>>> data = '\x00\r\xeb\x00\x00\x00\x00\x01t\x00'
>>> ' '.join(["%02X" % ord(char) for char in data])
'00 0D EB 00 00 00 00 01 74 00'
وأيضًا ، إذا كنت تقوم فقط بتحليل سلسلة البايت في الحقول ، فما عليك سوى تجاهل السلسلة واذهب لتفريغها مع struct
وحدة:
>>> import struct
>>> length, command, eggs, spam = struct.unpack('!BBi4s',data)
>>> #...whatever your fields really are
>>> print "len: %i\ncmd: %i\negg qty: %i\nspam flavor: '%s'" % (
... length, command, eggs, spam)
len: 0
cmd: 13
egg qty: -352321536
spam flavor: ' ☺t '
نصائح أخرى
\r
هو عودة عربة (0x0D) ، t
هو t
.
عند عرض البيانات كسلسلة ، يتم عرض أحرف قابلة للطباعة (مثل "t" كحرف ، يتم عرض تسلسل التحكم المعروف على أنها هروب ، ويتم عرض البايتات الأخرى في نموذج x ##. مثال:
>>> s='\x74\x0d\x99'
>>> s
't\r\x99'
يمكنك تفريغ شكل سداسي عشري مع:
>>> import binascii
>>> binascii.hexlify(s)
'740d99'