Найти - Пользователи
Полная версия: Размеры структуры ctypes
Начало » Python для новичков » Размеры структуры ctypes
1
kazenniy
Привет, народ!
Помогите разобраться с размерами, уже всю голову сломал.

Есть структура:
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

В чем проблема?
doza_and
kazenniy
В чем проблема?
Нет никакой проблемы. ctypes это типы “такие как в С”. А в C данные лежат не подряд а с выравниванием.
Это специально сделано. :) http://habrahabr.ru/post/142662/
kazenniy
Огромное спасибо за наводку!
Чтобы решить эту проблему нужно добавть _pack_ = 1 в описание класса.
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