Уведомления

Группа в Telegram: @pythonsu

#1 Сен. 15, 2013 22:56:01

Euler
Зарегистрирован: 2013-07-30
Сообщения: 43
Репутация: +  1  -
Профиль   Отправить e-mail  

форматированный вывод

Доброго времени суток. Совсем запутался с форматированием, подскажите пожалуйста реализацию. Задача такая - функция 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)

Офлайн

#2 Сен. 16, 2013 10:20:29

JOHN_16
От: Россия, Петропавловск-Камчатск
Зарегистрирован: 2010-03-22
Сообщения: 3292
Репутация: +  221  -
Профиль   Отправить e-mail  

форматированный вывод

В вашем примере данные не распаковываются, потому что длина исходной строки 24, а в шаблоне распаковщика указано 16. Вы уверены что у вас нету ошибки где то в исходных данных? Или вы банально пример некорректный привели?



_________________________________________________________________________________
полезный блог о python john16blog.blogspot.com

Офлайн

#3 Сен. 16, 2013 12:09:57

Euler
Зарегистрирован: 2013-07-30
Сообщения: 43
Репутация: +  1  -
Профиль   Отправить e-mail  

форматированный вывод

JOHN_16
В вашем примере данные не распаковываются, потому что длина исходной строки 24, а в шаблоне распаковщика указано 16. Вы уверены что у вас нету ошибки где то в исходных данных? Или вы банально пример некорректный привели?
Длина 16 байт - двоное слово, затем два слова и 8 отдельных байт. Не вижу где тут 24 байта, вроде везде 16.

Офлайн

#4 Сен. 16, 2013 12:26:40

JOHN_16
От: Россия, Петропавловск-Камчатск
Зарегистрирован: 2010-03-22
Сообщения: 3292
Репутация: +  221  -
Профиль   Отправить e-mail  

форматированный вывод

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



_________________________________________________________________________________
полезный блог о python john16blog.blogspot.com

Офлайн

#5 Сен. 16, 2013 13:05:04

Euler
Зарегистрирован: 2013-07-30
Сообщения: 43
Репутация: +  1  -
Профиль   Отправить e-mail  

форматированный вывод

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)
В программе данные из файла, поэтому проблема дальше, именно при выводе в строку.

Офлайн

#6 Сен. 16, 2013 14:53:38

JOHN_16
От: Россия, Петропавловск-Камчатск
Зарегистрирован: 2010-03-22
Сообщения: 3292
Репутация: +  221  -
Профиль   Отправить e-mail  

форматированный вывод

ВОт

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



_________________________________________________________________________________
полезный блог о python john16blog.blogspot.com

Офлайн

#7 Сен. 16, 2013 15:01:34

Euler
Зарегистрирован: 2013-07-30
Сообщения: 43
Репутация: +  1  -
Профиль   Отправить e-mail  

форматированный вывод

Понял, спасибо!

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version