像在 python 中一样在 C++ 中读取二进制文件

Posted

技术标签:

【中文标题】像在 python 中一样在 C++ 中读取二进制文件【英文标题】:reading a binary file in c++ just like in python 【发布时间】:2021-09-20 05:59:33 【问题描述】:

我想在 C++ 中以二进制模式读取文件。最初,当我使用 python 读取相同的文件时,我使用 python 来做同样的事情,我得到了结果b'\xe0\xa4\xb5\xe0\xa4\xbe\xe0\xa4\xb9',当转换为 INT 时,结果为224 164 181 224 164 190 224 164 185,我能够注意到所有这些 INT 始终在范围内 @ 987654324@.

我想在 c++ 中做同样的事情,但我无法做同样的事情我尝试了很多不同的技巧,但我能得到的最好的方法是 c++ 给出负整数。


#include <iostream>
#include <io.h>
#include <fcntl.h>
#include <fstream>
#include <stdio.h>

int main()

    std::fstream file("a.txt", std::ios::out | std::ios::in | std::ios::binary);
    file.seekg(0, std::ios::end);
    int size = file.tellg();
    char ch;
    std::string text;
    std::cout << "Size = " << size << std::endl;
    file.seekg(0, std::ios::beg);
    char x;
    file.read((&x), 1);
    std::cout << static_cast<int>(x) << std::endl;
    return 0;

请忽略#include,我已经使用了很多。

OUTPUT

Size = 9
-32

【问题讨论】:

打印时将值转换为unsigned int 嘿,但这会导致 4294967264 作为输出,但正如我所说,我想读取文件,以便我得到 [0,255] 范围内的 INT,你能建议任何方法吗 停止阅读chars。他们经常签名。请改用unsigned char&lt;cstdint&gt;uint8_tstd::byte 如果你有的话。 -32 与 224 的位模式相同。只是取决于您如何可视化它。 `ideone.com/hvekS6 当您使用char 时,它会将其视为signed char,其值在[-128, 127] 范围内,然后224 表示-32 【参考方案1】:

正如 cmets 中所提到的,这里的问题是 char 默认情况下是有符号的 - 这意味着它采用 [-128, 127] 范围内的值。这是,224 将滚动到负端并变为-32。 您应该使用unsigned char,这将使范围[0, 255]

#include <iostream>
#include <io.h>
#include <fcntl.h>
#include <fstream>
#include <stdio.h>

int main()

    std::fstream file("a.txt", std::ios::out | std::ios::in | std::ios::binary);
    file.seekg(0, std::ios::end);
    int size = file.tellg();
    unsigned char ch;
    std::string text;
    std::cout << "Size = " << size << std::endl;
    file.seekg(0, std::ios::beg);
    unsigned char x;
    file.read((&x), 1);
    std::cout << static_cast<int>(x) << std::endl;
    return 0;

【讨论】:

以上是关于像在 python 中一样在 C++ 中读取二进制文件的主要内容,如果未能解决你的问题,请参考以下文章

我可以像在 c++ 中使用指针一样修改函数中的变量而不在 python 中返回吗

用C++写的二进制文件,用JAVA怎么读取?

有没有办法像在 C++ 中挂钩非托管函数一样在 C# 中挂钩托管函数?

有没有办法像在 C++ 中挂钩非托管函数一样在 C# 中挂钩托管函数?

用C++写的二进制文件,用JAVA怎么读取?

C : 使用 && 运算符时是不是存在“惰性求值”,就像在 C++ 中一样?