【问题标题】:Reading binary file using Win32 API使用 Win32 API 读取二进制文件
【发布时间】:2014-12-15 01:55:22
【问题描述】:

我正在尝试读取二进制文件并写入不同的位置。

但代码只显示第一位 - “MZ”。根据 MSDN,“CreateFile 和 ReadFile 不要使用参数来区分文本和二进制文件类型。”但我的代码适用于 txt 文件。

                HANDLE hFile = CreateFile( L"C:\\in.exe", GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL); 
                if (hFile != INVALID_HANDLE_VALUE) 
                { 
                    char lpBuffer[2000] = "";
                    DWORD dwBytesRead = 0;
                    DWORD dwBytesWritten = 0;

                    HANDLE hTest = CreateFile(L"D:\\out.exe", GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, CREATE_ALWAYS, NULL, NULL);  
                    ReadFile(hFile, lpBuffer, sizeof(lpBuffer), &dwBytesRead, NULL); 
                    WriteFile(hTest, &lpBuffer[0], dwBytesRead, &dwBytesWritten, NULL);

                    CloseHandle(hFile); 
                    CloseHandle(hTest);
                }   

【问题讨论】:

  • the code displays only the first bit - "MZ" 是什么意思?可执行文件不可打印,如果您只是想将其发送到cout 或其他什么的。
  • @JonathanPotter 我的意思是,当我调试时,“lpbuffer”的值只显示“MZ”
  • 二进制文件可以包含零。然而,调试器将缓冲区显示为一个以 null 结尾的字符串,因此它只显示直到第一个零的字符。
  • 假设您的调试器是 Visual Studio,您可以添加一个监视并提供其他信息来控制数据的显示。您可以通过输入lpBuffer,2000 查看整个缓冲区。另请注意,lpBufferarray,而不是 pointer,因此您的前缀具有误导性。另外,一定要养成检查返回值的习惯。根据您的 Visual Studio 版本和版本,您可以让它分析代码以检查返回值失败。

标签: winapi


【解决方案1】:

当我运行以下代码时,我得到“2000 MZÉ 0”。

HANDLE hFile = CreateFile(L"C:\\cppConsole.exe",
    GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL);
if (hFile != INVALID_HANDLE_VALUE)
{
    char lpBuffer[2000] = "";
    DWORD dwBytesRead = 0;
    DWORD dwBytesWritten = 0;
    ReadFile(hFile, lpBuffer, sizeof(lpBuffer), &dwBytesRead, NULL);
    CloseHandle(hFile);
    std::wcout << dwBytesRead << L' ' << lpBuffer << L' ' << (int)lpBuffer[3] << L'\n';
}

请注意,它说 dwBytesRead 是 2000,换句话说,读取了 2000 个字节。它说 lpBuffer 是“MZÉ”的原因是因为它后面有一个空值。所以如果你把 lpBuffer 看成一个字符串,那么你只会得到一部分数据。

【讨论】:

    【解决方案2】:

    这很愚蠢……现在我知道为什么了。

                    char lpBuffer[2000] = "";
    

    对于二进制文件,缓冲区的大小要大得多。我将 2000 更改为 10000,现在可以了! 虽然 lpBuffer 只出现“MZ”,但它还是会继续进行。

    【讨论】:

      猜你喜欢
      • 2021-12-04
      • 2019-04-13
      • 2020-11-11
      • 2012-09-11
      • 2019-09-25
      • 2017-06-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多