优雅的方式将元信息添加到char数组

时间:2009-08-03 11:56:00

标签: c++

我想在字节数组中打包一些信息和一些元数据。在下面的 我有3个字节的信息,它们有一定的偏移量加上4个字节的元数据 最后在数据包的开头。解决方案1我提出来很明显 那但需要第二个tmp变量,我不太喜欢。

int size = 3;
int metadata = 4;

unsigned char * test = new unsigned char[size];
unsigned char * testComplete = new unsigned char[size+metadata];

test[offest1] = 'a';
test[offest2] = 'b';
test[offest3] = 'c';

set_first_4bytes(testComplete, val );           
memcpy(&testComplete[metadata], test, size);

另一个直截了当的解决方案是按以下方式进行:

unsigned char * testComplete = new unsigned char[size+metadata];

testComplete[offest1+metadata] = 'a';
testComplete[offest2+metadata] = 'b';
testComplete[offest3+metadata] = 'c';

set_first_4bytes(testComplete, val ); 

但是,我不喜欢这里的事实,每次我都要添加元数据偏移量,以便在最终数据包中获得正确的索引。还有另一种优雅的解决方案,它没有我的方法的缺点吗?

谢谢!

4 个答案:

答案 0 :(得分:2)

将数据和元数据存储在结构内的单独char数组中。在数组的长度上对结构进行模板化。

答案 1 :(得分:2)

我建议你使用C ++工具。使用真实类来构成数据。在课堂上,更喜欢std :: vector<>在普通数组上存储数据(除非你确实需要将数据存储在堆中)。如果需要,可以为向量中的内部数据提供常量访问器。

class data_type
{
public:
   data_type() : data_(), metadata_() {}

   const unsigned char * raw_data() const { // accessor to vector internal buffer
      return &data_[0];
   }
   const std::vector< unsigned char >& data() const {
      return data_;
   }
   const metadata_type& metadata() const {
      return metadata_;
   }
private:
   std::vector< unsigned char > data_;
   metadata_type metadata_; // it can be of any type
}; 

答案 2 :(得分:1)

unsigned char * testComplete = new unsigned char[size+metadata];
unsigned char * actualData = testComplete + metadata;

答案 3 :(得分:0)

// Create space for the first four bytes.
std::vector<char> testComplete(metadata);
testComplete.reserve(metadata+size);     // to avoid re-allocation

// Add last three to the back.
testComplete.push_back('a');    // sets testComplete[metadata+offset1] to 'a'
testComplete.push_back('b');
testComplete.push_back('c');

// pass raw pointer to char, or change this function to take std::vector
set_first_4bytes(&(testComplete[0]), val);