我有一个带有cytypes的Structure类的定义,它将通过套接字发送:
import ctypes
class MyStructure(Structure):
_pack_ = 1
_fields_ = [("field1", c_int),
("field2", c_longlong),
("data", c_char * 1000)]
和以下代码:
st = MyStructure()
strlist = str([i % 256 in range(1000)]) // 0,1,2,3,...
st.data = str.encode(strlist) // exception
最后一行引发异常:
ValueError:字节太长(3000,最大长度1000(
通过部分字符串可以解决问题,但我不明白错误的原因:
st.data = str.encode(strlist)[:1000] // OK
此外,我想知道哪种转换最直接地转换为大的"字节"类型变量,如st.data
(不想逐个赋值(?
正如Jon Clements在第一条评论中提到的,将字符串列表转换为int将任何int值转换为三个字符-值、逗号和空格。例如,将这个int列表intlist = [5, ]
转换为字符串列表strlist = str(intlist)
将生成len(strlist)
作为3!
将数据插入"字节"类型的另一种方法可能是:
st.data = b''
for i in range(1000):
st.data += (i % 256).to_bytes(1, "little")
创建一个字节字符串而不是Unicode字符串:
from ctypes import *
class MyStructure(Structure):
_pack_ = 1
_fields_ = [("field1", c_int),
("field2", c_longlong),
("data", c_char * 1000)]
st = MyStructure()
st.data = bytes([i % 256 for i in range(1000)])