Спокойные сокеты и порядок байтов

Я пишу программу, которая использует QUdpSocket для того, чтобы передать данные по сети. Это - моя первая программа сокета, и я столкнулся с интересной проблемой под названием Порядок байтов.

Мой фактический вопрос в, я должен волноваться о Порядке байтов, когда я использую QNetwork в качестве своей библиотеки сокетов? Если я действительно должен волноваться, что я должен сделать для надлежащего предотвращения проблем Порядка байтов?

Заранее спасибо.

6
задан cake 19 April 2010 в 16:45
поделиться

4 ответа

Как правило, вам нужно беспокоиться о порядке байтов при передаче целых чисел, превышающих один байт, с одного компьютера на другой. В C / C ++ это означает, что если вы отправляете что-то вроде 16-битного, 32-битного или 64-битного целого числа, вам необходимо сначала преобразовать целое число в сетевой порядок байтов (также известный как Big-Endian). Затем компьютер на принимающей стороне должен преобразовать входящие целые числа в порядок байтов хоста , который является любым порядком байтов, который хост-машина использует изначально. Обычно это делается с помощью серий библиотечных функций htons и ntohs , но с библиотекой Qt вы также можете использовать qToBigEndian и qFromBigEndian ] функции.

Обратите внимание, что вам не нужно беспокоиться о порядке байтов при отправке текста ASCII или UTF-8, потому что эти форматы состоят из последовательностей отдельных байтов, а не из многобайтовых типов данных.

11
ответ дан 8 December 2019 в 15:59
поделиться

Если вы передаете двоичные данные между двумя машинами с разным порядком байтов, вам, возможно, придется беспокоиться.

Сетевой сокет просто отправит данные без изменений. Если другие машины предполагают, что байты, которые он отправил, находятся в определенном порядке, вы должны управлять этим.

Если вы передаете данные в известном формате, например в изображении, то обычно в заголовке формата изображения есть что-то, чтобы показать, в каком порядке они были записаны, и библиотека для чтения / записи обработает это. Если вы изобретаете свой собственный двоичный формат - тогда решать вам. Возможно, вам также придется учитывать размер, сколько байтов занимает int на другой машине?

Хорошая новость: большинство машин - это Intel, и для большинства приложений, передающих меньшие объемы данных в формате ascii, подойдет.

2
ответ дан 8 December 2019 в 15:59
поделиться

Процессоры Intel используют прямой порядок байтов. Почти все остальное - с прямым порядком байтов. Сетевой порядок байтов по умолчанию - прямой порядок байтов.

Чтобы проверить, является ли порядок байтов проблемой, отправьте значение 0x12345678 и проверьте, совпадает ли оно с 0x78563412. Если значение на принимающем компьютере является более поздним значением, то порядок байтов в двух системах не одинаков.

Обратитесь к этой статье в Википедии для получения информации о порядке байтов.

0
ответ дан 8 December 2019 в 15:59
поделиться

Вот простой тест на прямой порядок следования байтов, если вы этого хотите:

// В этом тесте предполагается, что размер int не менее 2.

static const int testValue = 1;

#define is_bigendian () (( (char ) & testValue) == 0)

bool CD_is_bigendian (void) {{{1 }} return is_bigendian ();

1
ответ дан 8 December 2019 в 15:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: