Jaki jest przenośny sposób konwersji Byte-Order ciągów w C
Próbuję napisać serwer, który będzie komunikował się z dowolnym standardowym klientem, który może tworzyć połączenia z gniazdem (np. Klient telnet)
Zaczęło się od serwera echa, który oczywiście nie musiał się martwić o porządkowanie bajtów sieciowych.
Znam funkcje ntoh, ntohl, htons, htonl. Byłoby wspaniale, gdybym przesyłał albo 16 lub 32-bitowe inty, albo gdyby znaki w wysyłanym łańcuchu były wielokrotnościami 2 lub 4 bajtów.
Chciałbym utworzyć funkcję, która działa na ciągach znaków, takich jak:
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]);
}
}
Albo coś podobnego. Powyższa rzecz zakłada, że słowa mają 32 bity. Nie możemy być pewni, że słowa na maszynie wysyłającej nie mają 16 bitów lub 64 bitów?
W przypadku programów klienckich, takich jak telnet, muszą używać hton * przed wysłaniem i ntoh * po otrzymaniu danych, prawda?
EDYCJA: Dla ludzi ta rzecz, ponieważ 1-char jest bajtem, którego endian-ność nie ma znaczenia:
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]);
}
Uruchom ten fragment kodu. Dane wyjściowe dla mnie są następujące:
$ ./a.out
4 3 2 1
Te na chipsetach PowerPC powinny otrzymać '1 2 3 4', ale te z nas na chipsecie intel powinny zobaczyć to, co otrzymałem w większości.