繁体   English   中英

使用ReadFile WinAPI读取“二进制”文件

[英]Read 'Binary' files with ReadFile WinAPI

当我尝试使用ReadFile() Windows API打开'.exe'文件时,它只是返回文件的第2个字符,例如: MZ

这是我的代码:

#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读取二进制文件?

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

您没有显示代码,但是可能尝试使用printf或类似的东西进行打印。 IOW,您将其打印为C字符串。

好吧,二进制数据包括0,在这种情况下,前3个字节为'M','Z','\\ 0'-并打印为以零结尾的字符串“ MZ”。

如果要查看有意义的二进制数据打印,则必须为每个字节的十六进制数字编写一个转换器: 4D 5A 00 ,依此类推

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

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

您在书写/打印时遇到问题。 这主要取决于您要写入的位置,但是要在C ++中输出可能包含空值的(二进制)数据,请选择write方法

some_output_stream.write( buffer_ptr, num_bytes_in_buffer );

some_output_stream应该设置为二进制模式(std :: ios :: binary)。 没有此标志,所有具有值10的字节都可以转换为对13,10。

如果使用C FILE函数

fwrite( buffer_ptr, 1, num_bytes_in_buffer, some_output_file );

同样, some_output_file必须处于二进制模式。

在某些情况下,可以使用WriteFile来补充使用ReadFile

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM