Подписанное целочисленное преобразование сети и хоста - PullRequest
8 голосов
/ 02 февраля 2011

Я хотел бы преобразовать int32_t из байтового порядка хоста в сетевой байтовый порядок и наоборот. Я знаю о функции htonl() и ее вариантах, но для этого нужны целые числа без знака. Существует ли стандартная библиотечная функция, которая может делать то же самое со знаковыми целыми числами, или я должен реализовать ее сам? И если я должен сам это осуществить, как мне это сделать?

Я ищу программу, которая будет работать в Linux и Mac OS X.

Ответы [ 3 ]

7 голосов
/ 02 февраля 2011

Неважно.htonl касается байтов, а не арифметического значения числа.Используйте reinterpret_cast, чтобы изменить номер на unsigned и снова, если вам нужно.

2 голосов
/ 03 декабря 2011

Если одна система (вы никогда не знаете, что может быть под управлением Linux) потенциально может использовать различные представления для отрицательных целых чисел (например, дополнение, знаковая величина; редко, но возможно), то передайте числа в виде строк и проанализируйте их в целые на приемнике. Не так эффективно, но если вы не передаете большое количество цифр, это не будет иметь большого значения. Если нужно передать много чисел, вы можете использовать некоторую форму сжатия.

В качестве альтернативы, определите свое сетевое представление для отрицательных чисел и напишите свои собственные ntohsl и htonsl.

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

1 голос
/ 18 августа 2016

Если вы используете gcc, у него есть набор встроенных для этой цели.Обычно они сводятся к одной инструкции.

uint16_t __builtin_bswap16 (uint16_t x);
uint32_t __builtin_bswap32 (uint32_t x);
uint64_t __builtin_bswap64 (uint64_t x);

На моей машине __builtin_bswap32 () скомпилирован в

bswap   %eax
...