格式化字节数组

Formatting bytes array

我使用函数 readfile() 从预取文件中获取一些字节

BYTE   ReadBuffer[24];

for(i=0; i < 24; (i++))
{
  printf("%02X", *(ReadBuffer+i));
}

如果我使用 %02X,我会得到与我的十六进制编辑器相同的结果:

43 00 4F 00 4E 00 48 00 4F 00 53 00 54 00 2E 00 45 00 58 00 45 00 00 00

如果我使用 %C :

C O N H O S T . E X E 

好像是UTF-16LE,而且 结果我想要 CONHOST.exe(没有 space...)仅使用 WINAPI

我尝试使用 WideCharToMultiByte,但它不起作用..

CHAR AnsiPath[MAX_PATH]
WideCharToMultiByte(CP_ACP, 0, (PWCHAR)Buffer, -1, AnsiPath, sizeof(AnsiPath), NULL, NULL)

有人可以解释我哪里失败了吗?谢谢

这里是完整代码

int main(void)
{
    HANDLE hFile;
    DWORD  dwBytesRead = 0;
    BYTE   ReadBuffer[10266];
    DWORD nNumberOfBytesToRead = 10266;

    LPCWSTR fname = L"C:\Windows\Prefetch\CONHOST.EXE-3218E401.pf";
    hFile = CreateFile(fname,GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0);


    if (!ReadFile(hFile, ReadBuffer, nNumberOfBytesToRead, &dwBytesRead, NULL))
    {
            printf("Terminal failure: Unable to read from file.\n GetLastError=%08x\n", GetLastError());
            CloseHandle(hFile);
    }
    printf("Data read from %s (%d bytes): \n", fname, dwBytesRead);
    wprintf(L"%ld\n", ReadBuffer);
    int i;
    for(i=16; i < 40; i++)
    {
        printf("%C ", *(ReadBuffer+i));
    }
    char AnsiPath[MAX_PATH];
    int result = WideCharToMultiByte(CP_UTF8, 0, (PWCHAR)ReadBuffer, -1, AnsiPath, 0,0,0);
    printf("\nResult WideCharToMultiByte : %d\n", result); 

    printf("\nString : %s \n",AnsiPath);
    CloseHandle(hFile);
    system("pause");
    return 0;
}

结果:

Data read from C (9068 bytes):
3199640
C   O   N   H   O   S   T   .   E   X   E
Result WideCharToMultiByte : 2

String : ╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠
╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠
╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠
╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠(
Appuyez sur une touche pour continuer...

关于您发布的新代码:

看起来您的字符串从 ReadBuffer 的第 16 个字节开始,因此您需要使用 ReadBuffer+16 或其他方式从中转换。

您忘记了 sizeof(AnsiPath),就像您在上面发布的行一样。