【问题标题】:Read bytes and its decimal value from any kind of file in C++从 C++ 中的任何类型的文件中读取字节及其十进制值
【发布时间】:2013-11-14 17:58:46
【问题描述】:

这可能以前已经回答过,但我尝试了几种方法都没有成功。

我需要的是读取 C++ 中任何文件类型的所有字节并访问每个字节的十进制值。

Eg

some_file.txt
   ab¶

Expected outcome of each byte would be (in binary):
   01100001 01100010 11110100

Final result as a decimal (NEED THIS):
   97 98 244

some_file.bin
   01000001 01000010 11110100

Would have to read the 8 bits of each byte and return each value in decimal (NEED THIS)
   65 66 244

-

出于好奇,我需要小数来访问按照 ASCII 表组装的堆的位置,以计算每个字符的出现次数。


编辑 - 我有以下代码可以读取任何类型的文件:

readFile.cpp

char* mem;
void readFile(char* file_name)
{
    ifstream::pos_type size;
    ifstream file;
    file.open(file_name, ios::binary|ios::ate);
    if (file.is_open())
    {
        size = file.tellg();
        mem = new char[size];
        file.seekg(0, ios::beg);
        file.read(mem, size);
        file.close();
        delete[] mem;
    }else{
        cout << "Not able to open the file";
    }
}

main.cpp

if(argc != 2) {
    exit(1);
}
char* fileName = argv[1];

readFile(fileName);

cout << mem[0] << " | dec: " << (int) (unsigned char) mem[0] << endl;
cout << mem[1] << " | dec: " << (int) (unsigned char) mem[1] << endl;
cout << mem[2] << " | dec: " << (int) (unsigned char) mem[2] << endl;
cout << mem[3] << " | dec: " << (int) (unsigned char) mem[3] << endl;

当输入文件是“abc”之类的东西时,输出是正确的:

a | dec: 97
b | dec: 98
c | dec: 99

但是当输入包含一些扩展的 ASCII 字符时,输出会变得疯狂:

input = a¶aa

output = 
    a | dec: 97
    \ | dec: 92
    2 | dec: 50
    6 | dec: 54

【问题讨论】:

  • 哎呀!我处于 C# 模式。我会在几秒钟内修正我对 C++ 的回答。
  • 顺便说一句,您在完成之前删除了mem
  • 您的文件是否真的包含扩展的 ASCII 或您是否使用了 Unicode 文本编辑器?

标签: c++ file decimal ascii


【解决方案1】:

只需通过unsigned char(这也适用于C#,使用charbyte)转换为int 以获取字符代码。对计算机来说,它只是一个数字,没有二进制和十进制之分。

cout << mem[0] << " | dec: " << (int)(unsigned char)mem[0] << endl;

但你必须在delete[] mem 之前这样做。考虑改用vector&lt;char&gt;std::string

【讨论】:

  • 感谢@ben-voigt 的快速回答,但是对于像 ¶ 这样的 ASCII 扩展字符,转换返回的小数点不是正确的。
  • 用一个例子更新了问题。
  • @FladsonGomes:很抱歉在 C++ 问题上提供 C# 代码。 C++ 的问题是没有指定 char 的符号性,因此字节可以被解释为负数。修复非常简单,请参阅编辑。
  • 感谢您的回答,但它仍然不是正确的十进制代码,用您的答案和以下输出编辑了问题。
  • @Fladson:我刚刚注意到您正在从释放的内存中打印数据——您还需要修复它。
【解决方案2】:

您的文件没有您期望的字节。您的 C++ 代码显示的内容是

61 C2 B6 61

http://www.percederberg.net/tools/text_converter.html的帮助下:

C++没有错,那些真的文件中的字节。

【讨论】:

    猜你喜欢
    • 2013-12-03
    • 2015-12-09
    • 2015-05-01
    • 2022-01-17
    • 2021-08-02
    • 2014-02-25
    • 1970-01-01
    • 2012-09-15
    • 1970-01-01
    相关资源
    最近更新 更多