LINUX.ORG.RU

Модуль struct в python

 


0

1

Читаю луцца, затык на модуле struct https://tirinox.ru/python-struct/ Что почитать, чтобы понять такие строки кода?

import struct
struct.pack(«hhl», 1, 2, 3)

b'\x01\x00\x02\x00\x00\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00'

Я понимаю, что здесь импортируется модуль struct далее вызывается метод pack, который пакует эти числа в байты. Но что из этого получается? b'\x01\x00\x02\x00\x00\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00' Еще не могу понять, что означает «hhl» Короче хелп ми


Ответ на: комментарий от eternal_sorrow

Хм… а не реклама ли это техно-бложика, а то как-то тупо для реального вопроса со ссылкой на перевод документации.

vvn_black ★★★★★
()
Последнее исправление: vvn_black (всего исправлений: 1)

Но что из этого получается? b’\x01\x00\x02\x00\x00\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00’ Еще не могу понять, что означает «hhl»

Читай документацию строка «hhl» - это формат упаковки, где каждому символу соответсвует тип передаваемых параметров, так h - short(2-ух байтовое целое), а l - длинное целое(4 байта) и как итог

h -> \x01\x00 = 1 (сишное короткое целое)
h -> \x02\x00 = 2 (--//--)
     \x00\x00\x00\x00 - это для оптимального выравнивания на 64-разрядной системе
l -> \x03\x00\x00\x00 - 3 (сишное длинное целое)
     \x00\x00\x00\x00 - опять выравнивание

Порядок соответственно от младшего к старшему.

В целом плохо вы питон учите, т.к. 1-ым делом правильно было в документацию полезть, а не на форум.

AKonia ★★
()
Последнее исправление: AKonia (всего исправлений: 1)

Что почитать, чтобы понять такие строки кода?

например старину Гвидо «программирование на языке Python», там struct описан очень хорошо

AntonI ★★★★
()
Ответ на: комментарий от AKonia

l - длинное целое(4 байта)

Вот тут я немного не понимаю питоностроителей. В сишечке на 64х битной платформе длинное целое это 8 байт, но в struct все равно 4;-(

AntonI ★★★★
()
Ответ на: комментарий от AntonI

long - чаще 4 байта, а уже для long long - 8 байт и в некотором смысле единственным таким прям маргинальным является int, т.к. как раз есть типы byte(1), short(2), long(4), long long(8) и у них более менее определённый минимальный размер(и тонкость что int и меняют размер по сути только в случаях когда работа с 4-8 байтовым целым на конкретной машине имеет лучшую оптимизацию, а int как итог может быть любым из 2, 4, 8 байт, а из остальных кроме long который обычно не меньше int альтернативы собственно 4 и 8 байт(т.е. вариантов 2, а не 3), хотя повторюсь стандарты говорят по сути только о гарантиях минимального размера и тут надеяться на что-то большее бессмысленно, т.к. зависит от ОС/архитектуры.

AKonia ★★
()
Ответ на: комментарий от AKonia

Проверил в шланге и гцц

> cat check.c       
#include <stdio.h>

int main(){
    printf("%lu %lu %lu\n", sizeof(int), sizeof(long), sizeof(long long));
    return 0;
}

> ./check             
4 8 8
Aswed ★★★★★
()
Ответ на: комментарий от Aswed

И ? В чём-то нашли противоречие c ...хотя повторюсь стандарты говорят по сути только о гарантиях минимального размера и тут надеяться на что-то большее бессмысленно... ? У меня на трёх линуксах есть и 4 4 и 4 8, у винды на core 2 duo в 32-ух разрядной 7-ке 4 4, а в 64-ёх разрядной 8 8 в visual c++ 2010 и что самле печальное, это то, что эти размеры могут плавать даже при смене Си на Си++, почему собственно лучше выбирать типы учитывая именно минимальный гарантированный стандартом размер.

AKonia ★★
()
Последнее исправление: AKonia (всего исправлений: 2)

Да дело в том, что это нафиг не надо :D А будет надо, гугл в помощь

g1micks
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.