Что такое переносимый способ преобразования порядка байтов в C

Я пытаюсь написать сервер, который будет взаимодействовать с любым стандартным клиентом, который может устанавливать сокетные соединения (например, клиент telnet)

Он начинался как эхо-сервер, которому, конечно, не нужно было беспокоиться о порядке сетевых байтов.

Я знаком с функциями ntohs, ntohl, htons, htonl. Они были бы хороши сами по себе, если бы я передавал 16- или 32-битные целые числа или если символы в отправляемой строке были кратны 2 или 4 байта.

Я хотел бы создать функцию, которая работает с такими строками, как:

str_ntoh(char* net_str, char* host_str, int len)
{
    uint32_t* netp, hostp;
    netp = (uint32_t*)&net_str;
    for(i=0; i < len/4; i++){
         hostp[i] = ntoh(netp[i]);
    }
}

Или что-то подобное. Вышеуказанное предполагает, что размер слова 32-битный. Мы не можем быть уверены, что размер слова на отправляющем компьютере не 16-битный или 64-битный, верно?

Для клиентских программ, таких как telnet, они должны использовать hton * перед отправкой и ntoh * после получения данных, правильно?

РЕДАКТИРОВАТЬ: Для людей это вещь, потому что 1-символ является байтом, который не имеет значения:

int main(void)
{
    uint32_t a = 0x01020304;
    char* c = (char*)&a;
printf("%x %x %x %x\n", c[0], c[1], c[2], c[3]);

}

Запустите этот фрагмент кода. Вывод для меня выглядит следующим образом:

$ ./a.out
  4 3 2 1

Те, кто на чипсетах PowerPC должны получить '1 2 3 4', но те из нас, кто на чипсете Intel, должны увидеть то, что я получил выше по большей части.

Ответы на вопрос(4)

Ваш ответ на вопрос