Форум сайта python.su
1
Доброго времени суток. Совсем запутался с форматированием, подскажите пожалуйста реализацию. Задача такая - функция 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()))
Отредактировано Euler (Сен. 16, 2013 02:42:17)
Офлайн
221
В вашем примере данные не распаковываются, потому что длина исходной строки 24, а в шаблоне распаковщика указано 16. Вы уверены что у вас нету ошибки где то в исходных данных? Или вы банально пример некорректный привели?
Офлайн
1
JOHN_16Длина 16 байт - двоное слово, затем два слова и 8 отдельных байт. Не вижу где тут 24 байта, вроде везде 16.
В вашем примере данные не распаковываются, потому что длина исходной строки 24, а в шаблоне распаковщика указано 16. Вы уверены что у вас нету ошибки где то в исходных данных? Или вы банально пример некорректный привели?
Офлайн
221
>>> 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
Офлайн
1
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)
Офлайн
221
ВОт
>>> 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'
Офлайн
1
Понял, спасибо!
Офлайн