gpt4 book ai didi

C++ native 方式打包和解包字符串

转载 作者:搜寻专家 更新时间:2023-10-31 01:23:48 24 4
gpt4 key购买 nike

继我之前的 question .有没有一种方法可以使用 C++ native 习惯用法以压缩/位版本编写字符串。我在想类似 Perl 的 native pack and unpack 的东西.

最佳答案

根据阅读您之前的问题,我认为您的意思是说您想要二进制编码输出,而不是“压缩”输出。通常,“压缩”专指通过应用LZW编码等算法缩小了大小的数据。在您的情况下,您可能会发现输出在较小的意义上被“压缩”,因为对于各种各样的数字,二进制表示比 ASCII 表示更有效,但这不是标准意义上的“压缩” ,这可能就是您无法获得所需答案的原因。

我认为您实际上是在问以下问题:

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

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

其次,您必须使用 ostream::write() 将数据写入输出流,它不会尝试格式化您提供的字节。如果您只是使用默认的 operator<<() 流操作来写入值,您会发现您的数字只是被转换回 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();
}

关于C++ native 方式打包和解包字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/686378/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com