Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ruby-on-rails-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python将字符串转换为字节错误:ValueError:字节太长_Python_Byte_Structure_Ctypes - Fatal编程技术网

python将字符串转换为字节错误:ValueError:字节太长

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

我用cytpes定义了结构类,它将通过套接字发送:

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),我不知道这与注释中给出的生成字节字符串的代码有什么关系?