Есть ли проблемы с использованием htonl ?
#include <arpa/inet.h>
uint32_t htonl(uint32_t hostlong);
Значения в байтах должны оставаться неизменными, поэтому даже если вы хотите, чтобы значение со знаком и htonl принимали без знака какПока вы читаете его обратно в подписанный тип, вы не должны терять данные.(Как отмечает mctylr, сетевой порядок имеет порядок байтов.)
#include <arpa/inet.h>
#include <stdio.h>
int main(int argc, char** argv) {
int32_t pos = 1337;
int32_t neg = -123;
printf("host-endian: %d => 0x%08x %d => 0x%08x \n",
pos, pos, neg, neg);
uint32_t big_endian_pos = htonl(pos);
uint32_t big_endian_neg = htonl(neg);
printf("Big-endian: %d => 0x%08x %d => 0x%08x \n",
pos, big_endian_pos, neg, big_endian_neg);
}
И вывод на моем хосте с прямым порядком байтов:
[tmp]$ gcc endian.c && ./a.out
host-endian: 1337 => 0x00000539 -123 => 0xffffff85
Big-endian: 1337 => 0x39050000 -123 => 0x85ffffff