Требуется ли обратное преобразование для данных wchar_t?

StackOverflow https://stackoverflow.com/questions/421530

Вопрос

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

Это было полезно?

Решение

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

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

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

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, в котором есть все эти функции.

Другие советы

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top