Конверсия в целые числа со знаком

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

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

1) Если переполнение не является проблемой, неважно, читаю ли я в подписанные или неподписанные целые числа.

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

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

Спасибо


person Sid    schedule 05.12.2009    source источник
comment
Надеюсь, у вас есть скобки с этим (если это C).   -  person Tony van der Peet    schedule 05.12.2009


Ответы (1)


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

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

сделай это:

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

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

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

person Greg Hewgill    schedule 05.12.2009
comment
ntohs - это не общая функция библиотеки c, а функция из библиотеки сокетов (bsd). Чертовски полезно, но немного странно использовать библиотеку сокетов, чтобы получить служебные функции с порядком байтов: P - person Chris Becke; 05.12.2009
comment
Нет ничего странного в использовании функций сокетов, когда вы уже выполняете обмен данными по протоколу UDP. - person Greg Hewgill; 06.12.2009
comment
К сожалению, ntohs - устаревшее семейство функций, даже если они все еще широко используются и не документированы как таковые, поскольку не поддерживают 64-битные целые числа. Если вам нужно написать функцию для поддержки 64-битной версии, вы можете сделать ее шаблоном и поддерживать их все. - person UKMonkey; 18.10.2017