【问题标题】:How to read in binary data and cast to unsigned char (C++)如何读入二进制数据并转换为无符号字符(C++)
【发布时间】:2012-06-28 05:03:16
【问题描述】:

我有一个以二进制数据(无编码)保存的原始图像文件。我想读入文件并将值转换为无符号字符。但我不知道如何开始这样做。每个文件包含 640x480 字节。每个像素为 8 位。

我在这里使用了 C++ 帮助页面:http://www.cplusplus.com/doc/tutorial/files/,但是当我计算数据时,它似乎显示了相同的二进制/非人类可读字符。有人可以建议吗?到目前为止,这是我的代码:

    #include <iostream>
    #include <fstream>
    using namespace std;

ifstream::pos_type size;
char * memblock;

int main () {
  ifstream file ("imageData.raw", ios::in|ios::binary|ios::ate);
  if (file.is_open())
  {
    size = file.tellg();
    memblock = new char [size];
    file.seekg (0, ios::beg);
    file.read (memblock, size);

    cout << "the complete file content is in memory";

    for (int l=0; l<size; l++){
    cout << " memblock[] is = " << (unsigned char)memblock[l] << " index was l = " << l << endl;
    }

    file.close();


    delete[] memblock;
  }
  else cout << "Unable to open file";
  return 0;
}

这是输出的示例捕获:

 memblock[] is = ▀ index was l = 2937
 memblock[] is = E index was l = 2938
 memblock[] is = τ index was l = 2939
 memblock[] is = C index was l = 2940
 memblock[] is = ┘ index was l = 2941
 memblock[] is = B index was l = 2942
 memblock[] is = ╬ index was l = 2943
 memblock[] is = D index was l = 2944
 memblock[] is = ┼ index was l = 2945
 memblock[] is = C index was l = 2946
 memblock[] is = ╝ index was l = 2947
 memblock[] is = B index was l = 2948
 memblock[] is = ┤ index was l = 2949
 memblock[] is = B index was l = 2950
 memblock[] is = ¿ index was l = 2951
 memblock[] is = > index was l = 2952
 memblock[] is = í index was l = 2953
 memblock[] is = ; index was l = 2954
 memblock[] is = £ index was l = 2955
 memblock[] is = 6 index was l = 2956
 memblock[] is = á index was l = 2957
 memblock[] is = 4 index was l = 2958
 memblock[] is = Ñ index was l = 2959
 memblock[] is = 7 index was l = 2960
 memblock[] is = ╡ index was l = 2961

【问题讨论】:

    标签: c++ binary-data unsigned-char


    【解决方案1】:
    unsigned char* memblock; // change declaration of memblock
    
    ...
    
    memblock = new unsigned char[size]; // change to unsigned char
    file.seekg (0, ios::beg);
    file.read ((char*)memblock, size); // cast to a char* to give to file.read
    

    要打印数值而不是字符,请在打印前转换为 int

    (int) memblock[l]
    

    【讨论】:

    • 嗯,MathWizz,这给了我一个 int。我想将其转换为无符号字符(0 到 255)。没有办法吗?我只需要将其转换为 int 吗?
    • 预期输出是多少?你只是为了打印一个数字值吗?
    • 不,我想处理无符号字符。我得到以二进制形式保存的原始图像。我只是无法处理那种不可读的格式,所以我想使用无符号字符,以便我可以看到正在发生的事情。我现在只是为了调试而铸造。但我希望 memblock 基本上将所有这些值转换为无符号字符......
    • 所以您想将memblock 转换为unsigned char*
    • 问题在于 file.read 需要一个 char 作为输入参数1: istream& read ( char* s, streamsize n ); (cplusplus.com/reference/iostream/istream/read) ,所以我会遇到编译错误...
    猜你喜欢
    • 2015-12-14
    • 2012-10-25
    • 2022-09-22
    • 2020-01-22
    • 1970-01-01
    • 1970-01-01
    • 2016-01-18
    • 2015-01-11
    • 1970-01-01
    相关资源
    最近更新 更多