Требуется ли обратное преобразование для данных wchar_t?
-
05-07-2019 - |
Вопрос
В 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 ориентирован на байты, у вас больше нет проблем с порядком байтов.
Да, вам нужно выполнить преобразование в порядок байтов. Тщательно определите свой формат сериализации, то есть порядок байтов данных, которые передаются по сети или хранятся в файле на диске. Затем при отправке данных преобразуйте из собственного в проводной формат (может потребоваться или не требуется замена байтов), а при получении данных преобразуйте из проводного в собственный формат (снова может потребоваться или не потребоваться замена байтов). Вам следует выбрать проводной формат, который будет использоваться большинством клиентов, чтобы минимизировать средний объем обмена байтами.