ctypes 结构参数理解问题

ctypes structure parameter understanding problem

提问人:NormalToad 提问时间:11/9/2023 更新时间:11/9/2023 访问量:78

问:

我正在测试我在 Python 中使用的结构类。读数 只有.ctypesctypes Document 3.12.0_fields_

class Struct(ct.Structure):
    _fields_ = [
        ('Header', ct.c_short),
        ('Data_int', ct.c_int64),
        ('Data_string', ct.c_char)
               ]

test = Struct()
test.Header = 10
test.Data_int = 64
test.Data_string = 'bx'
>>> 
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-32-9b3bbfd7aaa9> in <cell line: 4>()
      2 test.Header = 10
      3 test.Data_int = 64
----> 4 test.Data_string = 'bx'

TypeError: one character bytes, bytearray or integer expected

为什么不起作用,但下一个有效?下一个是 ._fields__field_


class Struct(ct.Structure):
    _field_ = [
        ('Header', ct.c_short),
        ('Data_int', ct.c_int64),
        ('Data_string', ct.c_char)
               ]

test = Struct()
test.Header = 10
test.Data_int = 64
test.Data_string = 'bx'
>>>
蟒蛇 c ctypes

答:

1赞 Abdul Niyas P M 11/9/2023 #1

那么,实际的属性名称是 .ctype 类型等效于 Python 中的 1 个字符字节对象。因此,您需要分配一个字符字节对象才能使您的第一个代码段正常工作。_fields_ct.c_chartest.Data_string

import ctypes as ct

class Struct(ct.Structure):
    _fields_ = [
        ('Header', ct.c_short),
        ('Data_int', ct.c_int64),
        ('Data_string', ct.c_char)
               ]

test = Struct()
test.Header = 10
test.Data_int = 64
test.Data_string = b'b'

关于你的第二个片段并不特别。Python 允许您动态分配属性。因此,即使您删除并尝试分配 atrributes,它也不会引发任何错误。但是,在使用 时,您将无法实现预期的功能。_field__field__field_

import ctypes as ct


class Struct(ct.Structure):
    pass
test = Struct()
test.Header = 10
test.Data_int = 64
test.Data_string = b'b'

评论

0赞 NormalToad 11/9/2023
天哪,那是我的巨大错误(?谢谢你真诚的回答,先生。