Найти - Пользователи
Полная версия: форматированный вывод
Начало » Python для новичков » форматированный вывод
1
Euler
Доброго времени суток. Совсем запутался с форматированием, подскажите пожалуйста реализацию. Задача такая - функция f() возвращает 16 байт данных. Эти данные нужно вывести как GUID.
т.е. если на входе b'\00\01\02\03\04\05\06\07\08\09\0A\0B\0C\0D\0E\0F', то на выходе “03020100-0504-0706-08090A0B0C0D0E0F”.
должно получиться что-то типа этого:
str = "{:04X}-{:02X}-{:02X}-{:X}{:X}{:X}{:X}{:X}{:X}{:X}{:X}".format(unpack('IHHBBBBBBBB', f()))
JOHN_16
В вашем примере данные не распаковываются, потому что длина исходной строки 24, а в шаблоне распаковщика указано 16. Вы уверены что у вас нету ошибки где то в исходных данных? Или вы банально пример некорректный привели?
Euler
JOHN_16
В вашем примере данные не распаковываются, потому что длина исходной строки 24, а в шаблоне распаковщика указано 16. Вы уверены что у вас нету ошибки где то в исходных данных? Или вы банально пример некорректный привели?
Длина 16 байт - двоное слово, затем два слова и 8 отдельных байт. Не вижу где тут 24 байта, вроде везде 16.
JOHN_16
>>> s=b'\00\01\02\03\04\05\06\07\08\09\0A\0B\0C\0D\0E\0F'
>>> len(s)
24
>>> struct.unpack('IHHBBBBBBBB', s)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
struct.error: unpack requires a string argument of length 16
Euler
JOHN_16, это из-за незнания формата bytearray. Значит нужно проставлять x после каждого слеша.
>>> import struct
>>> s=b'\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0A\x0B\x0C\x0D\x0E\x0F'
>>> struct.unpack('IHHBBBBBBBB', s)
(50462976, 1284, 1798, 8, 9, 10, 11, 12, 13, 14, 15)
В программе данные из файла, поэтому проблема дальше, именно при выводе в строку.
JOHN_16
ВОт
>>> s                                                                                                                                                                                           
'\x00\x01\x02\x03\x04\x05\x06\x07\x08\t\n\x0b\x0c\r\x0e\x0f'
>>> ('{:08X}-{:04X}-{:04X}-'+'{:02X}'*8).format(*struct.unpack('I2H8B', s))
'03020100-0504-0706-08090A0B0C0D0E0F'
Euler
Понял, спасибо!
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB