¿Qué es una forma portátil de convertir Byte-Order de cadenas en C
Estoy tratando de escribir un servidor que se comunique con cualquier cliente estándar que pueda hacer conexiones de socket (por ejemplo, un cliente telnet)
Comenzó como un servidor de eco, que por supuesto no tenía que preocuparse por el orden de bytes de la red.
Estoy familiarizado con las funciones ntohs, ntohl, htons, htonl. Esto sería grandioso por sí mismo si transfiriera ints de 16 o 32 bits, o si los caracteres de la cadena que se envía fueran múltiplos de 2 o 4 bytes.
Me gustaría crear una función que funcione en cadenas como:
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]);
}
}
O algo similar. Lo anterior supone que el tamaño de la palabra es de 32 bits. No podemos estar seguros de que el tamaño de la palabra en la máquina de envío no sea de 16 bits o de 64 bits, ¿no?
Para los programas cliente, como telnet, deben usar hton * antes de enviar y ntoh * después de recibir los datos, ¿correcto?
EDITAR: Para la gente esa cosa porque 1-char es un byte que no importa la endiancia:
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]);
}
Ejecute este fragmento de código. La salida para mí es la siguiente:
$ ./a.out
4 3 2 1
Los que están en los conjuntos de chips PowerPC deben obtener '1 2 3 4', pero los que estamos en el conjunto de chips Intel debemos ver lo que obtuve arriba en su mayor parte.