我搜索并搜索了stackoverflow的答案,但还没找到我需要的东西。
我有一个例程,它将unsigned char数组作为参数,以便将其编码为Base64。我想在Base64中编码STL浮点向量(向量),因此需要将浮点向量中的字节重新解释为无符号字符数组,以便将其传递给编码例程。我已经尝试了很多东西,从重新解释和静态转换,到mem副本等,但它们似乎都没有工作(至少不是我实现它们的方式)。
同样,在将编码数据解码回浮点数组时,我需要做相反的事情。解码例程将解码数据作为unsigned char数组提供,我将需要重新解释该字节数组,再次将其转换为浮点数。
这是我的C ++代码的精简版本,用于编码:
std::string
EncodeBase64FloatVector( const vector<float>& p_vector )
{
unsigned char* sourceArray;
// SOMEHOW FILL THE sourceArray WITH THE FLOAT VECTOR DATA BITS!!
char* target;
size_t targetSize = p_vector.size() * sizeof(float);
target = new char[ targetSize ];
int result = EncodeBase64( sourceArray, floatArraySizeInUChars, target, targetSize );
string returnResult;
if( result != -1 )
{
returnResult = target;
}
delete target;
delete sourceArray;
return returnResult;
}
非常感谢任何帮助。感谢。
雷蒙德。
答案 0 :(得分:7)
std::vector
保证数据是连续的,你可以通过获取第一个元素的地址(假设它不为空)来获得指向向量中第一个元素的指针。
typedef unsigned char byte;
std::vector<float> original_data;
...
if (!original_data.empty()) {
const float *p_floats = &(original_data[0]); // parens for clarity
现在,要将其视为unsigned char
数组,请使用reinterpret_cast
:
const byte *p_bytes = reinterpret_cast<const byte *>(p_floats);
// pass p_bytes to your base-64 encoder
}
您可能希望在其余数据之前对矢量的长度进行编码,以便更容易对其进行解码。
注意:您仍然需要担心字节顺序和表示详细信息。这只有在您回读使用的同一平台(或兼容的平台)时才有效。
答案 1 :(得分:5)
sourceArray = reinterpret_cast<const unsigned char *>(&(p_vector[0]))
答案 2 :(得分:0)
我强烈建议您查看Google's protobuf以解决您的问题。浮动和双打可以在平台之间的大小和布局上有所不同,并且该包已经为您解决了所有这些问题。此外,它可以轻松处理您的数据结构,如果它变得比简单的浮点数组更复杂。
如果你使用它,你必须自己做base64编码,因为protobuf编码数据假设你有一个8位干净的通道可以使用。但那是相当微不足道的。