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

C++ C++;打包和解包字符串的本机方法,c++,binary,C++,Binary,跟随我之前的计划。有没有方法使用C++本地习语在压缩/位版本中编写字符串。我的想法与Perl的本机类似。如果没有其他东西,我相信您可以随时折叠Perl头和库。请参阅。基于阅读您前面的问题,我想您的意思是说您想要的是二进制编码的输出,而不是“压缩”的输出。通常,“压缩”是指通过应用LZW编码等算法而减小大小的数据。在您的例子中,您可能会发现输出在某种意义上是“压缩”的,因为对于各种各样的数字,二进制表示比ASCII表示更有效,但这不是标准意义上的“压缩”,这可能就是为什么您很难得到要找的答案的原因

跟随我之前的计划。有没有方法使用C++本地习语在压缩/位版本中编写字符串。我的想法与Perl的本机类似。

如果没有其他东西,我相信您可以随时折叠Perl头和库。请参阅。

基于阅读您前面的问题,我想您的意思是说您想要的是二进制编码的输出,而不是“压缩”的输出。通常,“压缩”是指通过应用LZW编码等算法而减小大小的数据。在您的例子中,您可能会发现输出在某种意义上是“压缩”的,因为对于各种各样的数字,二进制表示比ASCII表示更有效,但这不是标准意义上的“压缩”,这可能就是为什么您很难得到要找的答案的原因

我想你真的在问以下问题:

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

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


第二,必须使用ostream::write()将数据写入输出流,该函数不会尝试格式化给定的字节。如果您只是简单地使用默认运算符,那么实际上我的待办事项列表中已经有了它,但我还没有编写它。一个包应该很容易以类型安全的方式编写(序列化其实并没有那么难),另一方面,解包我还没有完全弄明白。我认为你应该提供更多关于你的平台和字符串的确切编码的信息。Packis非常灵活。我已经编写了一个小库来实现这个功能,它位于Google代码中:Code.Google.com/p/packlib/实际上,我只是为我的libperl++编写了这个库。除非我已经嵌入了perl,否则我会选择一个不同的解决方案。我已经使用guts进行了一些内联::C编程——我很高兴能够轻松地使用perl的C部分(而不是调用subs),并且在不需要大量额外编码的情况下从perl哈希和perl列表中获得同样的用途。我主要是用perl做C类型的工作。
#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();
}