ilyachalov (ilyachalov) wrote,
ilyachalov
ilyachalov

Categories:

Широкие символы в Windows

Записал (в режиме ios::binary) в файл объект класса, у которого два поля (C++):
wchar_t name[80]; // имя
short age;        // возраст

Что получилось:



Тут видно, как в Windows реализованы широкие символы (wchar_t). Каждый такой символ занимает 2 байта в кодировке UTF-16LE (в Linux, как пишут, широкий символ занимает 4 байта в кодировке UTF-32).

Обозначение «LE» (little endian) касается порядка, в котором в память записываются младший и старший байты широкого символа: в данном случае байты переставлены наоборот — сначала записан младший байт, затем старший.

На картинке видно, что файл занимает 162 байта. Первые 160 байт занял массив (еще такой массив часто называют буфером) из 80 широких символов (каждый по 2 байта). Последние 2 байта — целое число типа short.

В массиве хранится нуль-терминированная строка, содержащая имя «Илья», которая занимает 10 байт (8 байт под четыре буквы имени, на каждую букву — по 2 байта; и еще 2 байта — под нулевой символ):
18 04 3B 04 4C 04 4F 04 00 00
Чтобы стало еще понятнее, отделим каждые 2 байта друг от друга точками:
18 04 . 3B 04 . 4C 04 . 4F 04 . 00 00
Поменяем байты в каждой паре местами (из-за порядка байтов «LE», о чем писалось выше), чтобы получить номер символа в таблице Юникода:
04 18 . 04 3B . 04 4C . 04 4F . 00 00
То есть:
U+0418 . U+043B . U+044C . U+044F . U+0000
Или
И . л . ь . я . NUL

Последние 2 байта в файле, как уже писалось выше, являются целым числом типа short:
5F 00
Байты тут тоже расположены в порядке «LE», поэтому их следует поменять местами:
00 5F
Переведя из шестнадцатеричной системы счисления в десятичную, получим число 95.
Tags: Математика, Образование, Программирование
Subscribe

  • Post a new comment

    Error

    Anonymous comments are disabled in this journal

    default userpic

    Your IP address will be recorded 

  • 0 comments