Уведомления

Группа в Telegram: @pythonsu

#1 Дек. 9, 2015 19:59:42

kazenniy
Зарегистрирован: 2015-12-09
Сообщения: 16
Репутация: +  0  -
Профиль   Отправить e-mail  

Размеры структуры ctypes

Привет, народ!
Помогите разобраться с размерами, уже всю голову сломал.

Есть структура:

class AtaCmd(ctypes.Structure):
    _fields_ = [
        ('opcode', ctypes.c_ubyte),
        ('protocol', ctypes.c_ubyte),
        ('flags', ctypes.c_ubyte),
        ('featuresl', ctypes.c_ubyte),
        ('featuresh', ctypes.c_ubyte),
        ('sector_countl', ctypes.c_ubyte),
        ('sector_counth', ctypes.c_ubyte),
        ('lba_lowl', ctypes.c_ubyte),
        ('lba_lowh', ctypes.c_ubyte),
        ('lba_midl', ctypes.c_ubyte),
        ('lba_midh', ctypes.c_ubyte),
        ('lba_highl', ctypes.c_ubyte),
        ('lba_highh', ctypes.c_ubyte),
        ('device', ctypes.c_ubyte),
        ('command', ctypes.c_ubyte),
        ('control', ctypes.c_ubyte)]

ctypes.sizeof(AtaCmd) возвращает 16, как и должно быть. Меняю пару ubytes (features) на ushort

class AtaCmd(ctypes.Structure):
    _fields_ = [
        ('opcode', ctypes.c_ubyte),
        ('protocol', ctypes.c_ubyte),
        ('flags', ctypes.c_ubyte),
        ('features', ctypes.c_ushort),
        ('sector_countl', ctypes.c_ubyte),
        ('sector_counth', ctypes.c_ubyte),
        ('lba_lowl', ctypes.c_ubyte),
        ('lba_lowh', ctypes.c_ubyte),
        ('lba_midl', ctypes.c_ubyte),
        ('lba_midh', ctypes.c_ubyte),
        ('lba_highl', ctypes.c_ubyte),
        ('lba_highh', ctypes.c_ubyte),
        ('device', ctypes.c_ubyte),
        ('command', ctypes.c_ubyte),
        ('control', ctypes.c_ubyte)]

Теперь ctypes.sizeof(AtaCmd) возвращает 18. С какого? Ведь:
ctypes.sizeof(ctypes.c_ubyte) = 1
ctypes.sizeof(ctypes.c_ushort) = 2

В чем проблема?

Офлайн

#2 Дек. 9, 2015 20:41:08

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  253  -
Профиль   Отправить e-mail  

Размеры структуры ctypes

kazenniy
В чем проблема?
Нет никакой проблемы. ctypes это типы “такие как в С”. А в C данные лежат не подряд а с выравниванием.
Это специально сделано. :) http://habrahabr.ru/post/142662/



Офлайн

#3 Дек. 9, 2015 20:59:47

kazenniy
Зарегистрирован: 2015-12-09
Сообщения: 16
Репутация: +  0  -
Профиль   Отправить e-mail  

Размеры структуры ctypes

Огромное спасибо за наводку!
Чтобы решить эту проблему нужно добавть _pack_ = 1 в описание класса.

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version