arrays - 结构字段中的 ctypes 固定大小的 char 数组和初始化
问题描述
如何使用 初始化固定大小的字符数组,例如char a[32]
结构的字段ctypes
?例子:
import ctypes
class MyStructure(ctypes.Structure):
_fields_ = [("a", ctypes.c_char * 32)]
a = (ctypes.c_char * 32)(*b"Hi!")
mystruct = MyStructure(a=a)
这给了我一个错误:
Traceback (most recent call last):
File "...", line ..., in <module>
mystruct = MyStructure(a=a)
TypeError: expected bytes, c_char_Array_32 found
附加信息:这是一个 C++ DLL 的 MWE,它的结构具有固定大小的字符数组,用作字符串(例如,事物的名称)。
解决方案
按照错误消息的提示传递一个字节字符串。 ctypes
如果太长会抱怨:
import ctypes
class MyStructure(ctypes.Structure):
_fields_ = [("a", ctypes.c_char * 32)]
mystruct = MyStructure(b'Hi')
print(mystruct.a)
mystruct = MyStructure(b'Hi'*16)
print(mystruct.a)
mystruct = MyStructure(b'Hi'*17)
print(mystruct.a)
结果:
b'Hi'
b'HiHiHiHiHiHiHiHiHiHiHiHiHiHiHiHi'
Traceback (most recent call last):
File "D:\dev\Python36\Lib\site-packages\pythonwin\pywin\framework\scriptutils.py", line 326, in RunScript
exec(codeObject, __main__.__dict__)
File "C:\Users\metolone\Desktop\x.py", line 10, in <module>
mystruct = MyStructure(b'Hi'*17)
ValueError: bytes too long (34, maximum length 32)
推荐阅读
- java - 没有主体的接口存根方法如何产生效果?
- javascript - 为什么我的碰撞检测不适用于 Enemies vs playerOne
- spring-boot - 使用 Communda 启动 Spring Boot 应用程序时出错
- scala - 无法在playslick scala中将查询转换为操作
- java - 处理多个项目时将资源与 gradle 合并的问题
- css - 猫头鹰旋转木马动画速度
- python - .fit() 和 .cross_validate() 之间的区别 - python
- mysql - MySQL 游标循环查找最小值
- java - Pig-English 翻译程序显示不正确
- python - 在现有数据帧上从 .value_counts() 的输出创建新数据帧