小编Arp*_*ius的帖子

Python CFFI将结构转换为字典

有一种方法用字典初始化结构:

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)

python python-cffi

5
推荐指数
1
解决办法
1255
查看次数

如何处理读入ASIO streambuf的多余字符?

大多数库的解析器只能在一个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)

c++ boost boost-asio c++11

4
推荐指数
1
解决办法
2030
查看次数

标签 统计

boost ×1

boost-asio ×1

c++ ×1

c++11 ×1

python ×1

python-cffi ×1