【问题标题】:How to convert Text to Binary (and Reverse) in C++?如何在 C++ 中将文本转换为二进制(和反向)?
【发布时间】:2021-07-30 17:26:52
【问题描述】:

好的,这将是一个非常初学者的问题,虽然我似乎找不到关于这个主题的好的资源。

我想要的很简单。获取一个字符串(或 char*)并将其转换为可以存储在系统某处的二进制文件。
然后,以后,我希望能够读取该二进制文件并将其转换回字符串(或 char*)。

现在...
每当我搜索这个时,我经常会想到 序列化 的概念,这基本上就是我想要的。

但有一个问题,通常建议使用“Boost-Serialisation”。其中 (IMO) 对于仅将简单文本转换为二进制和将简单二进制转换为文本来说非常繁重。 (好吧,我知道这并不容易,但你明白了

得到是一种更简单的方法来处理这个问题。我希望你能帮我找到它。 :D


非常感谢您的回答。

【问题讨论】:

  • 当你说二进制文件时,你的意思是你想让文件有一个由一个字符和零字符组成的字符串吗?因为术语“二进制文件”是一个技术术语,指的是您无法使用文本编辑器打开的任何类型的文件。
  • @Noah 你绝对可以用文本编辑器打开它,它甚至可能有可读的内容。老实说,我想不出以二进制模式或文本模式编写的文件有什么区别,保存后你无法区分使用的是什么模式。
  • 那个“更简单的方法”被称为数据库系统。

标签: c++ visual-studio serialization boost c++17


【解决方案1】:

如何将文本转换为二进制(和反向)

没什么可做的。文本已经是数据,任何现代计算机中所有数据的内存表示总是二进制的。

你需要知道你的意思。如果您只是指“将其写入文件”(以任何表示形式),那么就这样做:

std::string my_text;
std::ofstream ofs("myfile.bin", std::ios::binary);
ofs.write(my_text.data(), my_text.size());

如果您需要一些特定表示(不同的字符集、编码甚至(存档)文件格式),您可能需要进行这种转换。

哦,免得我忘记了,复读一下:

std::ifstream ifs("myfile.bin", std::ios::binary);
std::string my_text(std::istreambuf_iterator<char>(ifs), {});

【讨论】:

【解决方案2】:

您可以使用 ofstream/ifstream。它们的工作方式与 cout/cin 类似,只是它读取和写入文件而不是控制台。也许这个链接有帮助:https://www.cplusplus.com/doc/tutorial/files/

【讨论】:

    【解决方案3】:

    您只需要使用位操作技巧。 C 和 C++ 都具有允许您通过逻辑门运行整数值的运算符。比如:

    x = 3 & 1 ;
    

    将 x 设置为 1,因为当您执行 AND 操作时,您将获取 & 左侧的每一位和 & 右侧的相应位,并将它们放入 And operation

    您也可以进行位移。您将位移动某个数字的位置。例如:

    y = 1 << 2;
    

    将整数 1 中的所有位移动 2,新的最右边的位将设置为零。

    因此,这样做的方法是:对于字符串中的每个字节,使用 128 进行 AND 运算,然后如果其中的值为零,则表示最左边的位为零(然后打印“0” ),如果不是,则值为 1(因此您打印“1”)。然后将其向左移动一位并再次执行操作。这样做八次,你已经将一个字节转换为二进制。

    【讨论】:

    • 这里回答了什么问题的哪一部分?您是否将问题解释为“如何混淆我的文本”?
    • 不,我说的是如何取一串字符,并制作另一个包含它的二进制表示的字符串。
    • 字符数据有多种二进制表示。为什么要选择一个效率特别低的?我认为您不小心回答了“如何将文本视为数字序列,然后以基数 2 数字系统打印这些数字”。我知道“base-2 numbers”通常被称为“binary numbers”,但“binary data”绝对指的是那个。 [另外,你有一个 catch-22 问题,因为现在你已经将你的数字序列转换为文本(0 和 1 的字符串)。嗯。你打算如何将该文本转换为二进制?]
    • 我想你不明白。计算机中的一切都已经是二进制的。我很确定 OP 想要一些可以将一段文本转换为包含 1 和 0 的字符串。
    • 哈。我认为您一定没有阅读我的答案(在您发表评论前一小时左右发布)然后:) 这正是我开始的重点。你可能是对的,但我相信我在这个网站上阅读问题的经验。没什么大不了的。我们拭目以待。
    猜你喜欢
    • 2015-02-27
    • 2018-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-02
    • 2021-05-01
    • 2012-10-09
    • 2021-05-08
    相关资源
    最近更新 更多