Требуется ли обратное преобразование для данных wchar_t? - PullRequest
7 голосов
/ 07 января 2009

В C / C ++, если многобайтовое значение широких символов (wchar_t) передается из системы с прямым порядком байтов в систему с прямым порядком байтов (или наоборот), получится ли то же значение на другом боковая сторона? Или байты нужно поменять местами?

Ответы [ 3 ]

9 голосов
/ 07 января 2009

Да, вам нужно поменять их местами.
Байты будут извлечены из транспорта в том же порядке, в котором они были вставлены. Просто на другом конце порядок этих байтов имеет другое значение. Поэтому вам нужно преобразовать их в правильный порядковый номер (это слово?).

Проверенным и верным методом является преобразование в сетевой порядок байтов перед передачей. Затем при получении конвертируйте обратно в определенный байтовый порядок хоста (из сетевого байтового порядка).

Набор функций для помощи в преобразовании байтов:

ntohs   Convert a 16-bit quantity from network byte order to host byte order
ntohl   Convert a 32-bit quantity from network byte order to host byte order
htons   Convert a 16-bit quantity from host byte order to network byte order
htonl   Convert a 32-bit quantity from host byte order to network byte order

Просто чтобы добавить еще одну предостережение.
Разные системы используют разные размеры для wchar_t, поэтому не допускайте, что sizeof (wchar_t) == 2.

Кроме того, каждый хост может использовать другой формат представления для wchar_t.
Чтобы помочь справиться с этим, большинство систем преобразуют текст в известный формат для транспорта (UTF-8 или UTF-16 - хороший выбор). Преобразуйте текст обратно в специальный формат хоста на другом конце.

Вы можете взглянуть на icu IBM, в котором есть все эти функции.

5 голосов
/ 08 января 2009

Преобразование в обратный порядок не является достаточным и, как следствие, не требуется. Sizeof (wchar_t) отличается, и, следовательно, кодировка тоже. Следовательно, вам необходимо согласовать формат обмена. Логичный выбор - UTF-8. Но поскольку UTF-8 ориентирован на байты, у вас больше нет проблем с порядком байтов.

0 голосов
/ 07 января 2009

Да, вам нужно выполнить обратное преобразование. Тщательно определите свой формат сериализации, то есть порядок байтов данных, которые передаются по сети или хранятся в файле на диске. Затем при отправке данных преобразуйте из собственного в проводной формат (может потребоваться или не требуется замена байтов), а при получении данных преобразуйте из проводного в собственный формат (снова может потребоваться или не потребоваться замена байтов). Вам следует выбрать формат проводного соединения, который будет использоваться большинством клиентов, чтобы минимизировать средний объем замены байтов.

...