所以我编写了一个小程序,将文件内容读入char数组(因为fstream似乎只支持char指针)。我想要做的是将原始字节发送到控制台。 AFAIK char是8位数据类型,所以它不应该太难。 但是,如果我只是打印数组的成员,我得到与ASCII值对应的字符,所以我使用静态强制转换。这工作正常,除了第一个字节似乎没有正确转换。 我使用PNG文件作为test.bin文件。 PNG文件始终以字节序列137,80,78,71,13,10,26,10开头。但是第一个字节打印不正确。我有一种感觉它必须做一些超过127的值。但是,我无法将读取缓冲区数据类型更改为其他任何内容(如unsigned char或unsigned short int),因为来自fstream的foo.read()仅支持char目标缓冲区。 如何让fstream将原始字节读入可用的无符号类型?
我的代码:
#include <iostream>
#include <fstream>
#include <sys/stat.h>
#define filename "test.bin"
void pause(){
std::string dummy;
std::cout << "Press enter to continue...";
std::getline(std::cin, dummy);
}
int main(int argc, char** argv) {
using std::cout;
using std::endl;
using std::cin;
// opening file
std::ifstream fin(filename, std::ios::in | std::ios::binary);
if (!fin.is_open()) {
cout << "error: open file for input failed!" << endl;
pause();
abort();
}
//getting the size of the file
struct stat statresults;
if (stat(filename, &statresults) == 0){
cout<<"File size:"<<statresults.st_size<<endl;
}
else{
cout<<"Error determining file size."<<endl;
pause();
abort();
}
//setting up read buffer and reading the entire file into the buffer
char* rBuffer = new char[statresults.st_size];
fin.read(rBuffer, statresults.st_size);
//print the first 8 bytes
int i=0;
for(i;i<8;i++) {
cout<<static_cast<unsigned short>(rBuffer[i])<<";";
}
pause();
fin.clear();
fin.close();
delete [] rBuffer;
pause();
return 0;
}
答案 0 :(得分:3)
-119签名是137无符号(二进制都是1000 1001) 这标志延伸到空头1111 1111 1000 1001,即65,417未签名 我认为这是你所看到的价值。
读入无符号缓冲区:
unsigned char* rBuffer = new unsigned char[statresults.st_size];
fin.read(reinterpret_cast<char*>(rBuffer), statresults.st_size);
答案 1 :(得分:0)
尝试除fin.read()以外的其他内容怎么样?
而不是:
char* rBuffer = new char[statresults.st_size];
fin.read(rBuffer, statresults.st_size);
您可以使用:
unsigned char* rBuffer = new unsigned char[statresults.st_size];
for(int i = 0; i < statresults.st_size; i++)
{
fin.get(rBuffer[i]);
}
答案 2 :(得分:0)
您可能希望将 unsigned char 用作“字节”。你可以尝试这样的事情:
using byte = unsigned char;
...
byte* buffer = new byte[statresults.st_size];
fin.read( reinterpret_cast<char*>( buffer ), statresults.st_size );
...
delete[] buffer;