C ++本地打包和解包字符串的方法

时间:2009-03-26 15:55:34

标签: c++ binary

关注我之前的question。有没有办法使用C ++本机习语在压缩/位版本中编写字符串。我在想像Perl的本地pack and unpack

2 个答案:

答案 0 :(得分:2)

如果没有别的,我相信你总是可以折叠perl头文件和库。请参阅perlguts

答案 1 :(得分:2)

基于阅读上一个问题,我认为您的意思是说您需要二进制编码输出,而不是“压缩”输出。通常,“压缩”用于特指通过应用诸如LZW编码的算法而尺寸减小的数据。在您的情况下,您可能会发现输出是“压缩”的,因为它较小,因为对于各种数字,二进制表示比ASCII表示更有效,但这不是标准意义上的“压缩”这可能就是为什么你无法得到你正在寻找的答案。

我认为你真的在问以下问题:

给定ASCII格式的数字(例如存储在std :: string中),如何将其作为二进制编码整数写入文件?

答案分为两部分。首先,您必须将ASCII编码的字符串转换为整数值。您可以使用诸如strtol之类的函数,该函数将返回与ASCII编码数相等的长整数值。请注意,对于可以用长整数表示的数字的大小存在限制,因此如果您的数字非常非常大,则可能需要在翻译它们时更具创造性。

其次,您必须使用ostream :: write()将数据写入输出流,而不会尝试格式化您提供的字节。如果您只是使用默认运算符<<()流操作来编写值,您会发现您的数字只会被转换回ASCII并以这种方式写出来。像这样把所有这些放在一起:

#include <stdlib.h>        // For strtol().
#include <arpa/inet.h>     // For htonl().
#include <fstream>         // For fstream.
#include <string>          // For string.

int main(int argc, char *argv[]) {
    char *dummy = 0;
    std::string value("12345");

    // Use strtol to convert to an int; "10" here means the string is 
    // in decimal, as opposed to, eg, hexadecimal or octol, etc.

    long intValue = strtol(value.c_str(), &dummy, 10);

    // Convert the value to "network order"; not strictly necessary, 
    // but it is good hygiene.  Note that if you do this, you will 
    // have to convert back to "host order" with ntohl() when you read 
    // the data back.

    uint32_t netValue = htonl(intValue);

    // Create an output stream; make sure to open the file in binary mode.

    std::fstream output;
    output.open("out.dat", std::fstream::out | std::fstream::binary);

    // Write out the data using fstream::write(), not operator<<()!

    output.write(reinterpret_cast<char *>(&netValue), sizeof(netValue));
    output.close();
}