Discussion:
endian y casting
(demasiado antiguo para responder)
JFL
2005-05-25 17:09:01 UTC
Permalink
sé que es una tonteria, pero no quiero seguir probando cosas sin ton ni
son... Tengo un char* que ha llegado por una conexion TCP, y uno de esos
bytes tengo que compararlo con un array de shorts para ver si ya existe
ese valor en el array.

Tal y como yo lo hago

if((unsigned short)datos[3]==array[1])
{
/* ok */
}

me funciona perfectamente en el PC, pero probandolo en un ultrasparc no
encuentra ninguna coincidencia (y la coincidencia está porque yo me
aseguro de que esté ;)

Supongo que sera cosas de little endian y big endian de los procesadores
al pasarle un solo byte para crear un short, pero no quiero llenar el
codigo de #ifdef para diferenciar los casos.

¿a alguien se le ocurre un cast rapido y sencillo que funcione en los
dos sistemas?

un saludo
Alberto Giménez
2005-05-25 19:15:38 UTC
Permalink
Post by JFL
sé que es una tonteria, pero no quiero seguir probando cosas sin ton ni
son... Tengo un char* que ha llegado por una conexion TCP, y uno de esos
bytes tengo que compararlo con un array de shorts para ver si ya existe
ese valor en el array.
Si quieres enviar sólo números, transfórmalos con hton* y ntoh*.

Si es algo más complejo (mensajes estructurados), te aconsejo que hagas
funciones para "serializar" los datos, pasándolos a ASCII,
multiplataforma.

Si te interesa enviar estructuras más o menos complejas, échale un
vistazo a la librería de serialización XDR. Saludos.
--
Luis Alberto Giménez
JabberID: ***@bulmalug.net
GnuPG ID: 0x3BAABDE1
JFL
2005-05-26 11:12:58 UTC
Permalink
Post by Alberto Giménez
Post by JFL
sé que es una tonteria, pero no quiero seguir probando cosas sin ton ni
son... Tengo un char* que ha llegado por una conexion TCP, y uno de esos
bytes tengo que compararlo con un array de shorts para ver si ya existe
ese valor en el array.
Si quieres enviar sólo números, transfórmalos con hton* y ntoh*.
Si es algo más complejo (mensajes estructurados), te aconsejo que hagas
funciones para "serializar" los datos, pasándolos a ASCII,
multiplataforma.
Si te interesa enviar estructuras más o menos complejas, échale un
vistazo a la librería de serialización XDR. Saludos.
No, la especificacion del protocolo es independiente y yo no puedo
cambiarlo. Se me ha ocurrido dar un rodeo haciendo el cast de short a
char a los elementos del array, y despues compararlo con el byte que
llega (ya que se compara sólo un byte, estos short no deberian valer mas
de 255). ¿Sabeis si este casting puede dar problemas en un sparc?
Oscar Garcia
2005-05-27 07:05:38 UTC
Permalink
Post by JFL
No, la especificacion del protocolo es independiente y yo no puedo
cambiarlo. Se me ha ocurrido dar un rodeo haciendo el cast de short a
char a los elementos del array, y despues compararlo con el byte que
llega (ya que se compara sólo un byte, estos short no deberian valer mas
de 255). ¿Sabeis si este casting puede dar problemas en un sparc?
No, ninguno. Ya que un byte solo puede ser con signo o sin signo. Sólo
en ese caso podrías encontrarte con el hipotético caso de una máquina
que represente valores negativos como complemente a 1 (en vez de a 2)
cosa que es extremadamente extraño y no cre que se de el caso.

De todas formas acostúmbrate a usar ntoh y hton para hacer las
conversiones de datos. Si el programa ha sido hecho desde el principio
sin tener en cuenta eso... ya va siendo hora de tenerlo en cuenta.

También puedes hacer una cosa...

if (1 != htons(1)) {
// Estamos en la máquina de tipo A y no debemos hacer
// Conversiones de ningún tipo (por extraño que parezca
// estás haciendo lo contrario que debieras).
} else {
// Usar hton* para convertir todos los valores sensibles.
}

Un saludo.
--
Óscar Javier García Baudet
LinaresDigital
http://redstar.linaresdigital.com/
Loading...