Was ist eine tragbare Methode zum Konvertieren der Byte-Reihenfolge von Zeichenfolgen in C
Ich versuche, einen Server zu schreiben, der mit jedem Standard-Client kommuniziert, der Socket-Verbindungen herstellen kann (z. B. Telnet-Client).
Es begann als ein Echoserver, der sich natürlich nicht um die Bestellung von Netzwerkbytes kümmern musste.
Ich kenne ntohs, ntohl, htons, htonl-Funktionen. Diese wären für sich genommen großartig, wenn ich 16- oder 32-Bit-Ints übertragen würde oder wenn die Zeichen in der zu sendenden Zeichenfolge Vielfache von 2 oder 4 Bytes wären.
Ich möchte eine Funktion erstellen, die mit folgenden Zeichenfolgen arbeitet:
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]);
}
}
Oder etwas ähnliches. Das oben Gesagte setzt voraus, dass die Wortgröße 32 Bit beträgt. Wir können nicht sicher sein, dass die Wortgröße auf dem sendenden Computer nicht 16-Bit oder 64-Bit ist, oder?
Für Client-Programme wie Telnet müssen sie hton * vor dem Senden und ntoh * nach dem Empfangen von Daten verwenden. Richtig?
EDIT: Für die Leute das Ding, weil 1-char ein Byte ist, das Endian-ness egal ist:
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]);
}
Führen Sie diesen Codeausschnitt aus. Die Ausgabe für mich ist wie folgt:
$ ./a.out
4 3 2 1
Diejenigen, die PowerPC-Chipsätze verwenden, sollten "1 2 3 4" erhalten, aber diejenigen, die Intel-Chipsätze verwenden, sollten sehen, was ich oben zum größten Teil erhalten habe.