elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Estamos en la red social de Mastodon


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  [Ayuda] Conversiones *char - int
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] 2 Ir Abajo Respuesta Imprimir
Autor Tema: [Ayuda] Conversiones *char - int  (Leído 4,283 veces)
Miky Gonzalez

Desconectado Desconectado

Mensajes: 87

http://mikygonzalez.comule.com/blog/


Ver Perfil WWW
[Ayuda] Conversiones *char - int
« en: 17 Septiembre 2013, 17:43 pm »

Supongamos que yo tengo la siguiente matriz:

Código
  1. char codigo[] = {0x00, 0xFF, 0x01, 0x03, 0x01, 0xFF, 0xFF, 0x00};

Con esta matriz se podrian hacer muchas cosas, desde interpretarla, hasta leer numeros. Mi pregunta:

En la posición 5 (recordar que empieza desde 0) y en la 6 hay 0xFF. Perfectamente podria poner en numero entero como 256, 256. Pero mi cuestion es: ¿Cómo puedo leer esos dos 0xFF, para que me queden como un 0xFFFF (tamaño de short int). Para que me entiendan, si hubiera: 0x4F, 0x33; quedaria: 0x4F33.

Se me ocurrieron varias opciones como: (0x4F << 2) &  0x33, pero ningun me funciona. ¿Podrían ayudarme?


En línea

Mi blog personal, con información acerca de programación, seguridad, desarrollo y electrónica:


EN CONSTRUCCIÓN
rir3760


Desconectado Desconectado

Mensajes: 1.639


Ver Perfil
Re: [Ayuda] Conversiones *char - int
« Respuesta #1 en: 17 Septiembre 2013, 18:18 pm »

Supongo se trata de C, ¿Correcto?

Un problema importante es la declaración del array:
Código
  1. char codigo[] = {0x00, 0xFF, 0x01, 0x03, 0x01, 0xFF, 0xFF, 0x00};
Ya que el tipo de los elementos es char y este usualmente tiene un rango valido de -128 a 127, si tratas de almacenar un valor mayor como 255 se genera comportamiento no definido.

Para concatenar los dos bytes la forma mas fácil es desplazando el byte mas significativo a la izquierda un numero de bits indicado por la macro CHAR_BIT (usualmente ocho) y al resultado se le realiza una operación OR con el byte menos significativo. Por ejemplo:
Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <limits.h> /* CHAR_BIT */
  4.  
  5. int main(void)
  6. {
  7.   int num[] = {0x00, 0xFF, 0x01, 0x03, 0x01, 0x4F, 0x33, 0x00};
  8.  
  9.   printf("0x%4X\n", num[5] << CHAR_BIT | num[6]);
  10.  
  11.   return EXIT_SUCCESS;
  12. }

Un saludo


En línea

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
Miky Gonzalez

Desconectado Desconectado

Mensajes: 87

http://mikygonzalez.comule.com/blog/


Ver Perfil WWW
Re: [Ayuda] Conversiones *char - int
« Respuesta #2 en: 17 Septiembre 2013, 21:08 pm »

Sólo tengo un problema, y es que mi matriz declarada tiene que ser declarada como char. De ahí el problema:
0xAA, 0xBB declarados ambos como char deben pasar a ser 0xAABB. :S
« Última modificación: 17 Septiembre 2013, 21:28 pm por Miky Gonzalez » En línea

Mi blog personal, con información acerca de programación, seguridad, desarrollo y electrónica:


EN CONSTRUCCIÓN
amchacon


Desconectado Desconectado

Mensajes: 1.211



Ver Perfil
Re: [Ayuda] Conversiones *char - int
« Respuesta #3 en: 17 Septiembre 2013, 21:45 pm »

¿Cómo puedo leer esos dos 0xFF, para que me queden como un 0xFFFF (tamaño de short int).
Y no te vale con un simple cast?

Código
  1. #include <stdio.h>
  2.  
  3. int main()
  4. {
  5.    char codigo[] = {0x00, 0xFF, 0x01, 0x03, 0x01, 0xFF, 0xFF, 0x00};
  6.  
  7.    for (short i = 0;i < 8;i++)
  8.        printf("%d \n",(unsigned short)codigo[i]);
  9.  
  10.    return 0;
  11. }
  12.  

O bien:

Código
  1. #include <stdio.h>
  2.  
  3. int main()
  4. {
  5.    char codigo[] = {0x00, 0xFF, 0x01, 0x03, 0x01, 0xFF, 0xFF, 0x00};
  6.    unsigned short valor = codigo[1];
  7.    printf("%d \n",valor);
  8.  
  9.    return 0;
  10. }
  11.  
En línea

Por favor, no me manden MP con dudas. Usen el foro, gracias.

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar
Miky Gonzalez

Desconectado Desconectado

Mensajes: 87

http://mikygonzalez.comule.com/blog/


Ver Perfil WWW
Re: [Ayuda] Conversiones *char - int
« Respuesta #4 en: 17 Septiembre 2013, 22:07 pm »

Ahí está el problema en la conversión por referencia, parece que se comete un bug en el gcc, porque en otras distros de gcc me funciona (lo recien acabo de comprobar, incluso en codepad), pero en la que yo uso no)... creo que no es problema de la programación, porque al convertir este a un short int, y almacenar el valor en un short int, al mostrarlo me devuelve un int.
En línea

Mi blog personal, con información acerca de programación, seguridad, desarrollo y electrónica:


EN CONSTRUCCIÓN
eferion


Desconectado Desconectado

Mensajes: 1.248


Ver Perfil
Re: [Ayuda] Conversiones *char - int
« Respuesta #5 en: 18 Septiembre 2013, 14:55 pm »

A ese nivel se te presenta un problema: arquitecturas big endian vs little endian.

Si tomamos por ejemplo el número 0x10203040, en memoria se guardará así:

* big endian: 0x10 0x20 0x30 0x40
* little endian: 0x40 0x30 0x20 0x10

Si tu accedes a los registros con un tipo char 8 bits... notarás la diferencia porque en ese caso la memoria la vas a recorrer siempre de forma secuencial... mientras que si manejas tipos de 32 bits no vas a notar diferencias.
En línea

0xDani


Desconectado Desconectado

Mensajes: 1.077



Ver Perfil
Re: [Ayuda] Conversiones *char - int
« Respuesta #6 en: 18 Septiembre 2013, 21:00 pm »

Código
  1. unsigned char codigo[] = {0x00, 0xFF, 0x01, 0x03, 0x01, 0xFF, 0xFF, 0x00};
  2. unsigned short *ptr = codigo + 5;
  3. printf("%x\n", *ptr);
  4.  

Tal vez eso funcione.

Saludos.
« Última modificación: 19 Septiembre 2013, 17:36 pm por 0xDani » En línea

I keep searching for something that I never seem to find, but maybe I won't, because I left it all behind!

I code for $$$
Hago trabajos en C/C++
Contactar por PM
rir3760


Desconectado Desconectado

Mensajes: 1.639


Ver Perfil
Re: [Ayuda] Conversiones *char - int
« Respuesta #7 en: 19 Septiembre 2013, 02:40 am »

Sólo tengo un problema, y es que mi matriz declarada tiene que ser declarada como char.
Entonces declara el array con el tipo unsigned char.

De ahí el problema:
0xAA, 0xBB declarados ambos como char deben pasar a ser 0xAABB.
Utilizando los operadores de desplazamiento y OR a nivel de bits:
Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <limits.h>
  4.  
  5. int main(void)
  6. {
  7.   unsigned char byte[] = {0x00, 0xFF, 0x01, 0x03, 0x01, 0xAA, 0xBB, 0x00};
  8.   unsigned short sh = byte[5] << CHAR_BIT | byte[6];
  9.  
  10.   printf("0x%X + 0x%X ==> 0x%X\n", byte[5], byte[6], sh);
  11.   /* Imprime: 0xAA + 0xBB ==> 0xAABB */
  12.  
  13.   return EXIT_SUCCESS;
  14. }

Otras formas, como ya te comento eferion, tienen sus problemas.

Un saludo
En línea

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
0xDani


Desconectado Desconectado

Mensajes: 1.077



Ver Perfil
Re: [Ayuda] Conversiones *char - int
« Respuesta #8 en: 19 Septiembre 2013, 17:37 pm »

Hay algún problema con la forma que yo he propuesto?
En línea

I keep searching for something that I never seem to find, but maybe I won't, because I left it all behind!

I code for $$$
Hago trabajos en C/C++
Contactar por PM
rir3760


Desconectado Desconectado

Mensajes: 1.639


Ver Perfil
Re: [Ayuda] Conversiones *char - int
« Respuesta #9 en: 19 Septiembre 2013, 18:37 pm »

Hay algún problema con la forma que yo he propuesto?
Al convertir la dirección de tipo "unsigned char *" a "unsigned short *" surgen dos problemas: 1) el ya comentado por eferion y 2) el puntero resultante debe cumplir con los requisitos de alineación para el tipo "unsigned short *".

Otra opción es utilizar una unión cuyos campos sean arrays: uno de caracteres y otros mas de tipo short, int, etc. pero en este caso hay que revisar la documentación del compilador para saber si se soportan lecturas/escrituras intercaladas (escribir utilizando el array de caracteres y luego leer utilizando el array de short's). Asi se elimina el problema de alineación pero queda el otro (orden de los bytes).

La única solución portable que recuerdo es utilizando los operadores de desplazamiento y OR a nivel de bits.

Un saludo
En línea

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
Páginas: [1] 2 Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Problema conversión Unsigned char a char
Programación C/C++
juliodiez 4 2,618 Último mensaje 19 Enero 2013, 04:34 am
por juliodiez
Pasar tipo const char* a char « 1 2 »
Programación C/C++
jorge_hura 15 10,652 Último mensaje 25 Julio 2013, 09:50 am
por Eternal Idol
conversiones
Dudas Generales
m@o_614 5 2,207 Último mensaje 8 Abril 2014, 05:55 am
por engel lex
Conversiones con stringstream
Programación C/C++
digimikeh 0 1,021 Último mensaje 26 Enero 2019, 20:57 pm
por digimikeh
Conversiones/casteos y coerciones de tipos en javascript por StringManolo
Desarrollo Web
@XSStringManolo 2 2,331 Último mensaje 1 Mayo 2020, 05:07 am
por @XSStringManolo
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines