2017-10-11 44 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