Endian преобразование подписанных целых

Я получаю данные с прямым порядком байтов по UDP и преобразовываю их в байты с прямым порядком байтов. Источник говорит, что целые числа подписаны, но когда я поменяю местами байты со знаком (особенно 16-битные), я получаю нереальные значения. Когда я обмениваю их как неподписанные целые, я получаю то, что ожидаю. Я полагаю, что исходная документация может быть неверной и на самом деле отправляет 16-разрядные целые числа без знака. Но почему это имеет значение? Предполагается, что все значения положительны и находятся под 16-битным INT_MAX, поэтому переполнение не должно быть проблемой. Единственное, о чем я могу думать, это то, что (1) документация неверна И (2) я неправильно обрабатываю знаковый бит, когда выполняю подписанный подстановочный порядок.

У меня действительно есть два вопроса:

1) Когда переполнение не является проблемой, имеет ли значение, прочитал ли я подписанные или неподписанные целые числа.

2) Различаются ли порядки замены порядка байтов между значениями со знаком и без знака (т. Е. Нужно ли обрабатывать бит знака по-разному)?

Я думал, что endian-преобразование выглядело одинаково для значений со знаком и без знака, например, для 16-битных value = value&0xff00 >> 8 | value&0x00ff << 8,

Спасибо

1 ответ

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

value & 0xff00 >> 8 | value & 0x00ff << 8

сделай это:

((value >> 8) & 0x00ff) | ((value & 0x00ff) << 8)

Проблема в том, что если value это 16-битное значение со знаком, то 0xabcd >> 8 является 0xffab, Наиболее значимый бит остается равным 1, если он начинается с 1 при знаковом сдвиге вправо.

Наконец, вместо того, чтобы писать эту функцию самостоятельно, вы должны использовать ntohs(),

Я согласен, используйте ntoh(), hton() и т. Д.

Другие вопросы по тегам