【问题标题】:Is this the correct way of doing byte I/O?这是进行字节 I/O 的正确方法吗?
【发布时间】:2015-04-09 10:14:16
【问题描述】:

我正在尝试将字节写入二进制文件,我编写了这个小测试程序来检查我是否正确执行。

std::uint8_t F = 10111001;

std::ofstream K("C:/Users/WDR/Desktop/kml.enc", std::ios::binary);

for(int i = 0; i < 256; i++)
{
    K << F;
}

文件正在正确写入。我得到一个 256 字节的文件。但是,当我在十六进制编辑器中看到它时,每个字节都显示值00011001。难道我做错了什么?还是在十六进制编辑器中看到的字节表示不同?请说清楚。谢谢。

【问题讨论】:

    标签: io binary byte ofstream uint8t


    【解决方案1】:

    10111001 不是二进制数。这是一个十进制数。将此编号分配给uint8_t 将得到10111001 % 256,即2511001 二进制。

    你想写std::uint8_t F = 0xB9;

    【讨论】:

    • 那么,如果我从文件中读取到std::vector&lt;std::uint8_t&gt;,我是否应该在读取的每个字节中添加0x 前缀,以便将其正确写入另一个文件?另外,0x 是什么意思,它也可以用于二进制表示吗?如果不是,我将如何将二进制表示的字节写入文件?将它们转换为十六进制?请说清楚。谢谢你的回答。
    • 数字前面的前缀0x表示它是一个十六进制数字。二进制数没有前缀,所以如果你想在你的c++代码中使用二进制数,你必须使用带有0x前缀的十六进制表示,带有0前缀的八进制表示或不带前缀的十进制表示.但这只是一个表示:0xB91850271 是同一个数字。
    • 如果您从一个文件读取并写入另一个文件,则无需考虑基础。每台计算机只有二进制数,您的问题是 c++ 文件中数字的表示。二进制文件的 0b 前缀在 c++ 中不存在,但在例如 Java 中。
    • 感谢您的确认,@mch。我已经测试过了,确实,在这种情况下我不需要担心它。但是,我必须将霍夫曼代码写入文件的情况呢?我在 C++ 程序中生成它们,它们表示为 0 和 1 的字符串。整个文件的编码在std::vector&lt;bool&gt; 中,我可以将它们一次累积8 位到std::uint8_t 中。如何将此std::uint8_t 写入文件? std:hex 然后std::showbase?
    • 我认为您应该简单地将值写入文件,该文件必须以二进制模式打开。 std::hexstd::showbase 用于文本输出,而不用于二进制文件。
    猜你喜欢
    • 2011-01-20
    • 1970-01-01
    • 2013-07-13
    • 1970-01-01
    • 2015-05-06
    • 1970-01-01
    • 2018-05-06
    • 1970-01-01
    • 2013-09-25
    相关资源
    最近更新 更多