Почему нет сокета ntol для подписанного лонг? - PullRequest
3 голосов
/ 03 декабря 2011

Если я хочу передать по сети длинный подпись (32-разрядное целое число), что мне делать?Если я отправлю длинную подпись, то на другом конце я не буду знать (потенциально), как удаленный компьютер представляет подписанные номера?Так что мне делать?

Ответы [ 3 ]

7 голосов
/ 04 декабря 2011

Просто используйте ntohl и htonl и приведите или неявно конвертируйте назад и вперед между uint32_t и int32_t.

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

Поскольку ntohl() работает по порядку байтов, поэтому его не волнует знак, все, что его волнует, это сколько битов там.Чтобы ответить на вопрос в заголовке.

Чтобы ответить на вопрос "что мне делать?"помимо того, что вы задаете вопрос - вы конвертируете его в неподписанный, а затем снова конвертируете в другой знак, потому что помимо того, что вы не знаете, подписан он или нет, произвольный пульт также не знает, что это за номер, и ваш конкретный пульт.может быть более осведомленным в этом вопросе.

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...