在c ++中使用struct来表示缓冲区格式

时间:2018-06-03 07:41:39

标签: c++

C ++新手。我有这个功能' Process'需要' in_buf'通常一个16字节的数据,但我正在写这个新的lineInterleaved类,它采用了这个' interleave_buf'格式。想知道这种表示格式的方式是否是用c ++编写代码的最佳方式?

struct interleave_buf {
        int32_t data_1_[8][128];
        int32_t data_2_[2][128];
        int16_t data_3_[128];
        int16_t index;
};

class lineInterleaved : public sp_line_t {
        public:
        virtual int Process(const void* in_buf, 
                size_t* in_sample_count,
                void* out_buf,  
                size_t* out_sample_count);
        private:
                struct interleave_buf buffer;
}


int lineInterleaved::Process(const void* in_buf, size_t* bytes, void* out_buf, size_t* out_sample_count) {
        if (in_buf == NULL || bytes == NULL) {
                return -EINVAL;
        }

        int8_t* out = static_cast<int8_t*>(out_buf);
        const int8_t* in = static_cast<const int8_t*>(in_buf);
        memcpy(buffer.data_1_, in, sizeof(buffer.data_1_));
        memcpy(buffer.data_2_, in + sizeof(buffer.data_1_), sizeof(buffer.data_2_));
        memcpy(buffer.data_3_, in + sizeof(buffer.data_1_) + sizeof(buffer.data_2_), sizeof(buffer.data_3_));
        memcpy(out, in + sizeof(buffer.data_1_) + sizeof(buffer.data_2_), sizeof(buffer.data_3_));
        *out_sample_count = sizeof(buffer.data_3_);
        return 0;
}

1 个答案:

答案 0 :(得分:0)

您不必将缓冲区复制到struct,为缓冲区指定指针是将缓冲区解析为struct的有效方法。

所以你只需将ponter分配给缓冲区,而不是所有memcpy s, 例如:

#include <iostream>
#include <cstring>
using namespace std;
struct clsA
{
    char a1[10];
    char a2[10];
};

void f(const void *buf)
{
    const clsA *pA = static_cast<const clsA*>(buf);
    cout << pA->a1 <<endl;
    cout << pA->a2 <<endl;
}

int main()
{
    char buf[30];
    strcpy(buf,"xx");
    strcpy(&buf[10],"yy");
    f(buf);
    return 0;
}

除非您想要保存您不会复制的数据,否则如果您想复制结构,您可以使用常规作业:

clsA b = *pA;

另一个问题,使用out参数指针是C风格,在C ++中,常见的方法是以引用变量的形式使用这种方式。

所以你的过程方法应该是:

int lineInterleaved::Process(const void* in_buf, size_t bytes, void* out_buf, size_t& out_sample_count)
  • 您应该仅将IN参数的值用于基本类型。
  • 对于复杂类型(类,结构),您应该对IN参数使用const引用。
  • 您应该使用ref仅针对OUT或IN \ OUT参数。