/
Inicio :: Foros

 F.A.Q.F.A.Q.                  Conéctese para revisar sus mensajesConéctese para revisar sus mensajes   

Problemas big y little endian

 
      Índice del Foro elrincondelc.com -> Programación en Servidores
Ver tema anterior :: Ver siguiente tema  
AutorMensaje
polly



Registrado: 19 Jul 2007
Mensajes: 618

MensajePublicado: 15/01/2011 12:16 pm
Título: Problemas big y little endian

Buenas, tengo un programa servidor en C de fecha y hora corriendo en una máquina Big endian (sparc) y un cliente del servidor corriendo en un máquina Little endian (intel).

Bueno el caso es que ambos se comunican con una conexión TCP, el cliente simplemente solicita la fecha y hora al servidor y este la devuelve; pero el cliente sólo recibe valores "basura" (se distingue un poco el mes y los dos puntos que separan la hora).
Probé a ejecutar el cliente en la misma máquina que el servidor y todo funcionó correctamente.

Asi que supongo que el endianess tendrá algo que ver y no se cómo pasar la estructura 'struct tm' de big endian a little endian.

S2
Volver arriba
Sorancio



Registrado: 29 May 2009
Mensajes: 1157
Ubicación: España

MensajePublicado: 15/01/2011 12:28 pm
Título:

Quizá ésto te sirva. ¡Mucha suerte!
Volver arriba
cheroky



Registrado: 22 Sep 2005
Mensajes: 2556
Ubicación: Valladolid (España)

MensajePublicado: 15/01/2011 3:01 pm
Título:

Hola.

Son dos problemas que resultan de manejar streams binarios entre arquitecturas diferentes; uno es el endianness y el segundo el alineamiento y como consecuencia el padding (relleno).

El primero se resuelve como ya te han comentado con funciones que cambian el "byte order", el segundo con extensiones del compilador, pero el problema de eliminar el padding deriva en que los agregados son irreconocibles por el API y deben ser reesamblados.

Entre arquitecturas diferentes pero con punteros del mismo tamaño, por ejemplo SPARC 32 e IA32 quizás baste solo lidiar con el endianness.

Soluciones; hay varias, pero me pregunto sino seria más conveniente que el servidor enviara los datos de forma "analógica" mediante una simple cadena o un array con númeritos.


·?0ƒ·
_________________
La cuestión no es si hay vida inteligente en otros planetas lejanos. La cuestión es si hay vida inteligente aquí.
Volver arriba
polly



Registrado: 19 Jul 2007
Mensajes: 618

MensajePublicado: 15/01/2011 4:05 pm
Título:

Gracias Sorancio, esa página ya la había visitado jeje. Pero esas funciones sólo sirven para convertir enteros y no estructuras (aunque ahora que me doy cuenta, la estructura 'struct tm' sólo está formada por enteros y podría convertir cada uno por separado ... pero mi idea era poder usar la función asctime() para que lo muestre como una cadena directamente).

Gracias cheroky. Si, mi primera idea fue que el servidor enviara una cadena de caracteres con la fecha y hora, pero me exigen que envíe una estructura struct tm.
Como ya comenté mi idea era imprimir la fecha y hora con la función asctime(), pero me da que tendré que convertir cada campo por separado y luego imprimirlos por separado.

S2
Volver arriba
rir3760



Registrado: 01 Oct 2004
Mensajes: 7516
Ubicación: Mexico

MensajePublicado: 16/01/2011 7:24 am
Título:

La unica solucion que garantiza la portabilidad de los datos es la indicada por cheroky. Si le explicas eso a tu profesor yo supongo no tendra inconveniente en permitir cambiar esa parte del programa.

Si no es posible tendrias que enviar primero la informacion sobre la estructura utilizando la macro "offsetof" para obtener la direccion base junto con su numero de bytes mediante el operador "sizeof", tambien se debe indicar (y ajustar) el orden de los bytes.

Ante ello sigo pensando que es mejor una buena dosis de diplomacia con el instructor.

Un saludo
_________________
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language
Volver arriba
polly



Registrado: 19 Jul 2007
Mensajes: 618

MensajePublicado: 16/01/2011 3:36 pm
Título:

Al final he optado por hacerlo "a pelo". A cada miembro de la estructura 'struct tm' le aplico ntohl() definiendo un array de cadenas para los dias y meses.

La opción que mencionas rir3760 puede valer para mi servidor, pero tengo otro apartado de la práctica en la que el servidor ya está creado y ejecutándose en la máquina devolviendo estructuras del tipo 'struct tm', y claro, eso no lo puedo cambiar.

Saludos.
Volver arriba
      Índice del Foro elrincondelc.com -> Programación en Servidores
Página 1 de 1Todas las horas están en GMT - 8 Horas

 
No puede crear mensajes
No puede responder temas
No puede editar sus mensajes
No puede borrar sus mensajes
No puede votar en encuestas

(c) ElRincondelC.com

Un proyecto de UrlanHeat.com