有一种方法用字典初始化结构:
fooData= {'y': 1, 'x': 2}
fooStruct = ffi.new("foo_t*", fooData)
fooBuffer = ffi.buffer(fooStruct)
Run Code Online (Sandbox Code Playgroud)
是否有一些准备好的功能来进行转换?
fooStruct = ffi.new("foo_t*")
(ffi.buffer(fooStruct))[:] = fooBuffer
fooData= convert_to_python( fooStruct[0] )
Run Code Online (Sandbox Code Playgroud)
我必须自己使用ffi.typeof("foo_t").字段吗?
到目前为止,我想出了这个代码:
def __convert_struct_field( s, fields ):
for field,fieldtype in fields:
if fieldtype.type.kind == 'primitive':
yield (field,getattr( s, field ))
else:
yield (field, convert_to_python( getattr( s, field ) ))
def convert_to_python(s):
type=ffi.typeof(s)
if type.kind == 'struct':
return dict(__convert_struct_field( s, type.fields ) )
elif type.kind == 'array':
if type.item.kind == 'primitive':
return [ s[i] for i in …
Run Code Online (Sandbox Code Playgroud) 大多数库的解析器只能在一个std::istream
或单个连续缓冲区上运行。这些解析器读取istream直到eof结束,而不是文档结束。即使有一个boost::asio::streambuf
可以使用的istream
,也存在读取和提交一帧图像的问题。诸如此类read_until
的函数将提交所读取的任何内容,并且如果它们读取下一帧的片段,则解析填充将失败。
这个嘲笑example on Coliru正说明问题所在。
假设我们需要一个有效的解决方案,而无需复制缓冲区,那么我需要确保流的末尾是文档的正确末尾。我当前的解决方案是扫描数据,并在一个准备好的缓冲区上进行提交/消耗乘以:
size_t read_some_frames( boost::asio::streambuf& strbuf,
std::function< void(istream&) > parser ) {
auto buffers= strbuf.prepare( 1024 );
size_t read= bad_case_of_read_some( buffers );
vector< std::pair< size_t, size_t > > frames;
std::pair< size_t, size_t > leftover= scanForFrames(
buffers_begin(buffers),
buffers_begin(buffers)+read,
frames, '\0' );
for( auto const& frame: frames ) {
cout << "Frame size: " << frame.first
<< " skip: " << frame.second << endl;
strbuf.commit( frame.first );
strbuf.consume( frame.second …
Run Code Online (Sandbox Code Playgroud)