我有问题在C ++中将字符串解释为压缩二进制数据。在python中,我可以使用struct模块。 C ++中是否有模块或方法将字符串解释为压缩二进制数据而不嵌入Python?
答案 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中的pickling,boost serialization可能最接近你想要达到的目标。
否则你可能想手工完成。使读/写类将原语/类转换为压缩二进制格式并不困难。我会通过移动字节来避免主机字节序问题。