Я пишу программу, которая использует QUdpSocket для того, чтобы передать данные по сети. Это - моя первая программа сокета, и я столкнулся с интересной проблемой под названием Порядок байтов.
Мой фактический вопрос в, я должен волноваться о Порядке байтов, когда я использую QNetwork в качестве своей библиотеки сокетов? Если я действительно должен волноваться, что я должен сделать для надлежащего предотвращения проблем Порядка байтов?
Заранее спасибо.
Как правило, вам нужно беспокоиться о порядке байтов при передаче целых чисел, превышающих один байт, с одного компьютера на другой. В C / C ++ это означает, что если вы отправляете что-то вроде 16-битного, 32-битного или 64-битного целого числа, вам необходимо сначала преобразовать целое число в сетевой порядок байтов (также известный как Big-Endian). Затем компьютер на принимающей стороне должен преобразовать входящие целые числа в порядок байтов хоста , который является любым порядком байтов, который хост-машина использует изначально. Обычно это делается с помощью серий библиотечных функций htons
и ntohs
, но с библиотекой Qt вы также можете использовать qToBigEndian
и qFromBigEndian
] функции.
Обратите внимание, что вам не нужно беспокоиться о порядке байтов при отправке текста ASCII или UTF-8, потому что эти форматы состоят из последовательностей отдельных байтов, а не из многобайтовых типов данных.
Если вы передаете двоичные данные между двумя машинами с разным порядком байтов, вам, возможно, придется беспокоиться.
Сетевой сокет просто отправит данные без изменений. Если другие машины предполагают, что байты, которые он отправил, находятся в определенном порядке, вы должны управлять этим.
Если вы передаете данные в известном формате, например в изображении, то обычно в заголовке формата изображения есть что-то, чтобы показать, в каком порядке они были записаны, и библиотека для чтения / записи обработает это. Если вы изобретаете свой собственный двоичный формат - тогда решать вам. Возможно, вам также придется учитывать размер, сколько байтов занимает int на другой машине?
Хорошая новость: большинство машин - это Intel, и для большинства приложений, передающих меньшие объемы данных в формате ascii, подойдет.
Процессоры Intel используют прямой порядок байтов. Почти все остальное - с прямым порядком байтов. Сетевой порядок байтов по умолчанию - прямой порядок байтов.
Чтобы проверить, является ли порядок байтов проблемой, отправьте значение 0x12345678 и проверьте, совпадает ли оно с 0x78563412. Если значение на принимающем компьютере является более поздним значением, то порядок байтов в двух системах не одинаков.
Обратитесь к этой статье в Википедии для получения информации о порядке байтов.
Вот простой тест на прямой порядок следования байтов, если вы этого хотите:
// В этом тесте предполагается, что размер int не менее 2.
static const int testValue = 1;
#define is_bigendian () (( (char ) & testValue) == 0)
bool CD_is_bigendian (void) {{{1 }} return is_bigendian ();