python将字符串转换为字节错误:ValueError:字节太长
我用cytpes定义了结构类,它将通过套接字发送:python将字符串转换为字节错误:ValueError:字节太长,python,byte,structure,ctypes,Python,Byte,Structure,Ctypes,我用cytpes定义了结构类,它将通过套接字发送: import ctypes class MyStructure(Structure): _pack_ = 1 _fields_ = [("field1", c_int), ("field2", c_longlong), ("data", c_char * 1000)] 以及以下代码: st
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)
Pass partial string将解决此问题,但我不理解错误的原因:
st.data = str.encode(strlist)[:1000] // OK
另外,我想知道哪种转换最直接,可以转换成大的“字节”类型变量,例如
st.data
(不想逐个赋值)正如Jon Clements在第一条评论中提到的,将字符串列表转换为int将任何int值转换为三个字符-值、逗号和空格。例如,将这个整数列表intlist=[5,]
转换成字符串列表strlist=str(intlist)
将产生len(strlist)
为3
将数据插入“bytes”类型的另一种方法可以是:
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)])
如果你
打印(strlist)
你就会明白为什么。。。您将获得包含整数的列表的字符串表示形式-与字节无关。。。你能不能不直接生成字节?例如:字节(n%256表示(1000)范围内的n)
?我试过了,但得到了:b“”的值真的吗?如果你真的复制并粘贴上面的内容,你会得到一个空字节字符串?是的。这个变量被预先定义为ctype结构(c_char*1000),我不知道这与注释中给出的生成字节字符串的代码有什么关系?