在 C++ 中解析混合二进制数据
Parsing Mixed Binary Data in C++
我正在解析一大堆数据。它具有混合数据类型,一些双打后跟一些浮点数。这就是我将双打解析为向量的方式。如果有更好的方法来做到这一点,我只是想得到一些反馈。我觉得可能有一种方法可以更简洁地做到这一点。
BlobData::MyDoubles is a vector<double>;
BlobData::MyDoubles MyClass::GetDataPointsFromBlob(const text* blob, const int numDoubles)
{
BlobData::MyDoubles::value_type* doubles = new BlobData::MyDoubles::value_type[numDoubles];
memcpy(doubles, blob, numDoubles*sizeof(BlobData::MyDoubles::value_type));
BlobData::MyDoubles returnVal = BlobData::MyDoubles(doubles,doubles+numDoubles);
delete [] doubles;
return returnVal;
}
您不需要额外分配,因为无论如何 vector 都会复制内容。
要将数据从指针转换为 void/char/whatever_blob,请使用 reinterpret_cast
,这正是它的用途。你可以用一对迭代器构造向量(指针是迭代器)。
vector<double> GetDataPoints(const char* blob, const int numDoubles) {
const double* dbegin = reinterpret_cast<const double*>(blob);
return { dbegin, dbegin + numDoubles };
}
另请注意,由于 C++ 中的指针运算,最终我们没有任何 sizeof(double)
P.S。与您的代码(没有异常安全性)不同,此代码具有很强的异常安全性。
而对于尺码类型最好使用dedicated size_t
.
我正在解析一大堆数据。它具有混合数据类型,一些双打后跟一些浮点数。这就是我将双打解析为向量的方式。如果有更好的方法来做到这一点,我只是想得到一些反馈。我觉得可能有一种方法可以更简洁地做到这一点。
BlobData::MyDoubles is a vector<double>;
BlobData::MyDoubles MyClass::GetDataPointsFromBlob(const text* blob, const int numDoubles)
{
BlobData::MyDoubles::value_type* doubles = new BlobData::MyDoubles::value_type[numDoubles];
memcpy(doubles, blob, numDoubles*sizeof(BlobData::MyDoubles::value_type));
BlobData::MyDoubles returnVal = BlobData::MyDoubles(doubles,doubles+numDoubles);
delete [] doubles;
return returnVal;
}
您不需要额外分配,因为无论如何 vector 都会复制内容。
要将数据从指针转换为 void/char/whatever_blob,请使用 reinterpret_cast
,这正是它的用途。你可以用一对迭代器构造向量(指针是迭代器)。
vector<double> GetDataPoints(const char* blob, const int numDoubles) {
const double* dbegin = reinterpret_cast<const double*>(blob);
return { dbegin, dbegin + numDoubles };
}
另请注意,由于 C++ 中的指针运算,最终我们没有任何 sizeof(double)
P.S。与您的代码(没有异常安全性)不同,此代码具有很强的异常安全性。
而对于尺码类型最好使用dedicated size_t
.