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()
,