Рассмотрим следующий код:Определение с htons порядок байт
#include <stdio.h>
#include <arpa/inet.h>
int main(int argc, char *argv[]) {
uint16_t num = 123;
if (htons(num) == num) {
printf("big endian\n");
} else {
printf("little endian\n");
}
}
Я задаюсь вопросом, работает ли этот код для проверки порядка байтов? Я видел много вопросов, проверяющих его с помощью различных указателей/char трюков, но я считаю, что это проще. Это исходит из предположения, что если вы конвертируете число в порядок сетевого байта (big endian), если оно совпадает с исходным номером, то вы находитесь в системе с большим энтиром. В противном случае вы находитесь в системе немного endian.
Есть ли ложное предположение в этой проверке? Возможно, сетевой порядок не всегда большой, но it seems it is standardised to be so.
Примечание. У меня нет большой эндианной машины, чтобы проверить этот код, и попытки имитировать такую систему оказываются недружелюбными. –
Если вы хотите быть полностью основательным, предположение состоит в том, что порядок байтов является либо большим, либо бесконечным. Были архитектуры, которые использовали другие байтовые заказы (например, PDP-11 сохранил 32-битное значение 0x01020304 как 0x02 0x01 0x04 0x03). Очевидно, что есть только две возможности для хранения 16-битного значения. –
Реальный вопрос: почему вы вообще заботитесь? 'htons' & friends точно предназначены для того, чтобы пользователь не заботился о endianess. Условия размещения в onm-блоке, основанные на определенной контенте, обычно нарушаются по дизайну. – Olaf