2014-12-17 22 views
5

Vì vậy, tôi đang cố gắng tìm ra lý do tại sao kích thước của ctypes.Structure của tôi không phải là những gì nó nên được. Mã của tôi là sau đây, theres cũng tính toán những gì kích thước nên được afaik.python ctypes cấu trúc sai kích thước byte

class FILE_HEAD(ctypes.Structure): 
    _fields_ = [ 
     ("name", ctypes.c_char * 4),     # 4 bytes 
     ("size", ctypes.c_int),       # 4 bytes 
     ("Cal_l", ctypes.c_double),      # 8 bytes 
     ("Cal_r", ctypes.c_double),      # 8 bytes 
     ("Speed_ChL", ctypes.c_byte),     # 1 byte 
     ("Speed_Pulses_ChL", ctypes.c_int),    # 4 bytes 
     ("Speed_factor_ChL", ctypes.c_double),   # 8 bytes 
     ("Quantity_ChL", ctypes.c_char * 3),   # 3 bytes 
     ("Description_ChL", ctypes.c_char * 32),  # 32 bytes 
     ("Unit_ChL", ctypes.c_char * 8),    # 8 bytes 
     ("Speed_ChR", ctypes.c_byte),     # 1 byte 
     ("Speed_Pulses_ChR", ctypes.c_int),    # 4 bytes 
     ("Speed_factor_ChR", ctypes.c_double),   # 8 bytes 
     ("Quantity_ChR", ctypes.c_char * 3),   # 3 bytes 
     ("Description_ChR", ctypes.c_char * 32),  # 32 bytes 
     ("Unit_ChR", ctypes.c_char * 8)     # 8 bytes 
    ]             # = 136 bytes 

Vì vậy, tôi nghĩ rằng cấu trúc nên có kích thước 136 byte. Nhưng khi tôi cho python in kích thước của một thể hiện của cấu trúc print ctypes.sizeof(COMI_HEAD) Tôi nhận được 144. Tôi không biết 8 byte đó đến từ đâu.

Tôi đã điền dữ liệu đó vào và ghi vào tệp để xem tất cả các byte và phân tích các byte.

comi = FILE_HEAD() 
comi.name = "COMI" 
comi.size = ctypes.sizeof(comi) - 8 
comi.Cal_l = 342.324 
comi.Cal_r = 342.324 
comi.Speed_ChL = ctypes.c_byte(1) 
comi.Speed_Pulses_ChL = 123 
comi.Speed_factor_ChL = 123.456 
comi.Quantity_ChL = "Tes" 
comi.Description_ChL = "Test Desc" 
comi.Unit_ChL = "t/t" 
comi.Speed_ChR = ctypes.c_byte(1) 
comi.Speed_Pulses_ChR = 123 
comi.Speed_factor_ChR = 123.456 
comi.Quantity_ChR = "Tes" 
comi.Description_ChR = "Test Desc" 
comi.Unit_ChR = "t/t" 

Dưới đây là những gì Trình xem HEX của tôi hiển thị cho tôi. Tôi đã đánh dấu màu đỏ, mà byte tôi nghĩ là 8 byte là quá nhiều, nhưng tôi không biết nơi mà 8 byte đến từ. 3 byte đầu tiên tôi đánh dấu đến trực tiếp sau Speed_ChL phải là 1 byte nhưng trông giống như 4 byte của nó. 5 byte tiếp theo tôi đã đánh dấu ở cuối tệp. Có chuỗi này Unit_ChR phải là 8 byte nhưng có vẻ như là 13 byte.

enter image description here

Ai đó có thể cho tôi biết sai lầm của tôi ở đâu? Tôi làm gì sai ở đây? Bất kỳ trợ giúp được đánh giá cao!

+1

Tôi nghĩ rằng nó chỉ là sắp xếp các thành viên để chúng bắt đầu ở vị trí đẹp. –

+0

ok ... tôi có thể ngăn chặn điều đó bằng cách nào đó không? Tôi thực sự cần rằng '0's để biến mất – patsimm

+0

Không thực sự chắc chắn. Bạn đang sắp xếp nó? Tôi nghĩ rằng padding có thể khác nhau tùy thuộc vào phần cứng vì vậy đó không phải là một ý tưởng tốt. –

Trả lời

6

Ok vì vậy tôi đã tìm thấy giải pháp. Nhờ Andreas, người đã nói với tôi rằng vấn đề của tôi liên quan đến số offset. Vì vậy, giải pháp là thêm _pack_ = 1 vào cấu trúc như vậy.

class FILE_HEAD(ctypes.Structure): 
    _pack_ = 1 
    _fields_ = [ 
     ("name", ctypes.c_char * 4),     # 4 bytes 
     ("size", ctypes.c_int),       # 4 bytes 
     ("Cal_l", ctypes.c_double),      # 8 bytes 
     ("Cal_r", ctypes.c_double),      # 8 bytes 
     ("Speed_ChL", ctypes.c_byte),     # 1 byte 
     ("Speed_Pulses_ChL", ctypes.c_int),    # 4 bytes 
     ("Speed_factor_ChL", ctypes.c_double),   # 8 bytes 
     ("Quantity_ChL", ctypes.c_char * 3),   # 3 bytes 
     ("Description_ChL", ctypes.c_char * 32),  # 32 bytes 
     ("Unit_ChL", ctypes.c_char * 8),    # 8 bytes 
     ("Speed_ChR", ctypes.c_byte),     # 1 byte 
     ("Speed_Pulses_ChR", ctypes.c_int),    # 4 bytes 
     ("Speed_factor_ChR", ctypes.c_double),   # 8 bytes 
     ("Quantity_ChR", ctypes.c_char * 3),   # 3 bytes 
     ("Description_ChR", ctypes.c_char * 32),  # 32 bytes 
     ("Unit_ChR", ctypes.c_char * 8)     # 8 bytes 
    ]             # = 136 bytes 
+1

Hoặc sử dụng 'FILE_HEAD = struct.Struct ('<4siddbid3s32s8sbid3s32s8s');' 'comi = FILE_HEAD.pack (b" COMI ", FILE_HEAD.size - 8, 342.324, 342.324, 1, 123, 123.456, b" Tes ", b "Test Desc", b "t/t", 1, 123, 123.456, b "Tes", b "Test Desc", b "t/t") '. – eryksun

+0

Lưu ý rằng bạn có được chính xác cùng một vấn đề lập trình trong C và _worse still_ giải pháp có xu hướng là trình biên dịch cụ thể. –

+0

nó thực sự hữu ích –

Các vấn đề liên quan