2017-10-11 18 views
0

当我尝试打开“.EXE”文件与ReadFile()的Windows API,它只是返回,如文件的2第一个字符:MZ读出“二进制”与ReadFile的WinAPI的文件

这里是我的代码:

#define BUFFERSIZE 5000 

VOID CALLBACK FileIOCompletionRoutine(
__in DWORD dwErrorCode, 
__in DWORD dwNumberOfBytesTransfered, 
__in LPOVERLAPPED lpOverlapped 
); 

VOID CALLBACK FileIOCompletionRoutine(
__in DWORD dwErrorCode, 
__in DWORD dwNumberOfBytesTransfered, 
__in LPOVERLAPPED lpOverlapped) 
{ 
    _tprintf(TEXT("Error code:\t%x\n"), dwErrorCode); 
    _tprintf(TEXT("Number of bytes:\t%x\n"), dwNumberOfBytesTransfered); 
    g_BytesTransferred = dwNumberOfBytesTransfered; 
} 

HANDLE hFile; 
DWORD dwBytesRead = 0; 
char ReadBuffer[BUFFERSIZE] = { 0 }; 
OVERLAPPED ol = { 0 }; 
hFile = CreateFile(fullFilePath.c_str(),    // file to open 
    GENERIC_READ,   // open for reading 
    FILE_SHARE_READ,  // share for reading 
    NULL,     // default security 
    OPEN_EXISTING,   // existing file only 
    FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED, // normal file 
    NULL);     // no attr. template 

ReadFileEx(hFile, ReadBuffer, BUFFERSIZE - 1, &ol, FileIOCompletionRoutine); 

当我打印ReadBuffer这只是MZ(exe文件)。

但使用:

std::ifstream file(argv[1], std::ios::in | std::ios::binary); 

它的工作完美。 如何使用ReadFile读取二进制文件?

+2

你怎么打印'ReadBuffer'?作为NUL终止的字符串,我怀疑。当然不是。 –

+0

@IgorTandetnik我把'ReadBuffer'的值放到String中,并用'std :: cout'打印字符串。 –

+3

准确地说。您将它打印为文本数据,但它是二进制数据。它可能在'MZ'后面有一个零字节,并且打印在那里停止。 –

回答

0

如何使用ReadFile读取二进制文件?

ReadFile(和ReadFileEx)工作在二进制模式。您无需任何翻译即可逐字节获取确切的文件内容。

您在写入/打印时遇到问题。这主要取决于你想要写的,但对于outputing(二进制)数据可能包含空值在C++中选择write方法

some_output_stream.write(buffer_ptr, num_bytes_in_buffer); 

some_output_stream应设置为二进制模式(STD :: IOS ::二进制)。如果没有这个标志,所有值为10的字节都可以翻译成对13,10。

若C FILE函数用于

fwrite(buffer_ptr, 1, num_bytes_in_buffer, some_output_file); 

some_output_file再次必须以二进制模式。

在某些情况下,WriteFile可以与您的使用ReadFile互补使用。

2

问题不在于阅读,问题在于打印。

你没有显示你的代码,但你可能试图用printf或类似的东西打印。 IOW,你将它打印成C字符串。那么,二进制数据包含0,在这种情况下,前3个字节是'M','Z','\ 0' - 并且打印为空字符结尾的字符串“MZ”。

你不得不转换器写入每字节十六进制数字,如果你想看到的二进制数据的有意义的打印:4D 5A 00

+0

像String(或'ReadBuffer')到十六进制转换器? –

+0

'ReadBuffer',绝对是'ReadBuffer'。 void * buffer,int readSize' – Arkadiy

+0

std :: string(const char *,size_t)也会传递二进制数据。 – Arkadiy