当我尝试使用ReadFile()
Windows API打开'.exe'文件时,它只返回文件的第一个字符,如: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读取二进制文件?
答案 0 :(得分:2)
问题不在于阅读,问题在于打印。
您没有显示您的代码,但您可能尝试使用printf
或类似内容进行打印。 IOW,你把它打印成C字符串。
好吧,二进制数据包含0,在这种情况下,前3个字节是'M','Z','\ 0' - 并打印为以空字符结尾的字符串“MZ”。
如果要查看二进制数据的有意义打印,则必须为每字节十六进制数编写转换器:4D 5A 00
等等
答案 1 :(得分:0)
如何使用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
的使用补充。