我想在字节数组中打包一些信息和一些元数据。在下面的 我有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 );
但是,我不喜欢这里的事实,每次我都要添加元数据偏移量,以便在最终数据包中获得正确的索引。还有另一种优雅的解决方案,它没有我的方法的缺点吗?
谢谢!
答案 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);