在C ++中将字符串解释为压缩二进制数据

时间:2012-03-28 08:38:56

标签: c++

我有问题在C ++中将字符串解释为压缩二进制数据。在python中,我可以使用struct模块。 C ++中是否有模块或方法将字符串解释为压缩二进制数据而不嵌入Python?

4 个答案:

答案 0 :(得分:1)

C ++中的字符串有一个名为c_str(http://www.cplusplus.com/reference/string/string/c_str/)的方法。

c_str以字符数组的形式返回字符串中的相关二进制数据。您可以将这些字符转换为您想要的任何字符,并将其作为一组数字读取。

答案 1 :(得分:1)

基本上,您不需要解释任何内容。在C ++中,字符串是 打包二进制数据;你可以将它们解释为文本,但你不是 被要求。请注意字符串的基础类型 C ++是char,可以是签名(范围[-128,127] 我听说过的机器)或未签名的机器(通常是[0,255],但我知道 机器所在的地方[0,511]

要将字符串中的原始数据传递给C程序,请使用 std::string::data()std::string::size()。否则,你可以 像使用迭代器或索引一样访问它 std::vector<char>(可能更好地表达意图)。

答案 2 :(得分:1)

如前所述,最好将这个字节数组(字符或无符号字符)视为std :: vector而不是字符串。字符串以空值终止,那么如果二进制数据的一个字节的值为零,会发生什么?

您可以将数组中的指针强制转换为指向结构的指针,也可以将数据复制到结构上:

#include <memory>

#pragma pack ( push )
#pragma pack( 1 );

struct myData
{
    int data1;
    int data2;
    // and whatever
};

#pragma pack ( pop ) 


char* dataStream = GetTheStreamSomehow();

    //cast the whole array
myData* ptr = reinterpret_cast<myData*>( dataStream );
    //cast from a known position within the array
myData* ptr2 = reinterpret_cast<myData*>( &(dataStream[index]) );

    //copy the array into a struct
myData data;
memcpy( &data, dataStream, sizeof(myData) );

如果要将数据流放在向量中,[]运算符仍然有效。 pragma pack声明确保结构是单字节对齐的 - 研究这个是留给读者的练习。 : - )

答案 3 :(得分:0)

虽然它可能更接近python中的picklingboost serialization可能最接近你想要达到的目标。

否则你可能想手工完成。使读/写类将原语/类转换为压缩二进制格式并不困难。我会通过移动字节来避免主机字节序问题。