Представление wchar_t и char в WinDbg - PullRequest
3 голосов
/ 20 апреля 2009

Примечание:

/*
* Trivial code
*/
wchar_t *greeting = L"Hello World!";
char *greeting_ = "Hello World!";

WinDbg:

0:000> ?? greeting
wchar_t * 0x00415810
"Hello World!"
0:000> ?? greeting_
char * 0x00415800
"Hello World!"

0:000> db 0x00415800
00415800  48 65 6c 6c 6f 20 57 6f-72 6c 64 21 00 00 00 00  Hello World!....
00415810  48 00 65 00 6c 00 6c 00-6f 00 20 00 57 00 6f 00  H.e.l.l.o. .W.o.
00415820  72 00 6c 00 64 00 21 00-00 00 00 00 00 00 00 00  r.l.d.!.........

Вопрос:

  • Какова цель символа NULL : 00 между символами ASCII в wchar_t - Win32 ?

Ответы [ 3 ]

10 голосов
/ 20 апреля 2009

wchar_t - строка широких символов, поэтому каждый символ занимает 2 байта памяти. «H» при a wchar_t равно 0x0048. Поскольку x86 имеет младший порядок, вы видите байты в памяти в порядке 48 00.

db в windbg сбросит байты и предоставит представление о том, что он рассматривается как строка ASCII, следовательно, H.E.L. ... вывод вы видите. Вы можете использовать 'du' для выгрузки памяти в виде строки в юникоде.

2 голосов
/ 20 апреля 2009

Ответ заключается в том, что символы wchar_t являются 16-битными величинами, поэтому для каждого требуется два байта. Каждый символ представляет собой символ UTF-16 . Поскольку используемые вами буквы находятся в диапазоне ASCII, они имеют значения <256, поэтому старший байт равен нулю для каждой двухбайтовой пары. </p>

1 голос
/ 20 апреля 2009

wchar_t для юникода , в то время как char для стандартных 8 битов ascii

в wchar_t каждый символ представлен 16 битами, но «стандартные» символы расположены в нижней половине диаграммы. Традиционный китайский , например, будет иметь другие значения, чем 00 для этих байтов.

...