格式化字节数组

时间:2015-01-13 10:42:59

标签: c winapi

我使用函数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(没有空间...)仅使用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...

1 个答案:

答案 0 :(得分:0)

关于您发布的新代码:

看起来您的字符串从ReadBuffer的第16个字节开始,因此您需要使用ReadBuffer+16或其他任何内容进行转换。

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