• Domingo 15 de Diciembre de 2024, 07:39

Autor Tema:  hexadecimal en con 0x  (Leído 2741 veces)

blasata

  • Miembro activo
  • **
  • Mensajes: 32
    • Ver Perfil
hexadecimal en con 0x
« en: Martes 9 de Noviembre de 2010, 20:52 »
0
Hola, mirar no sé si se podrá hacer pero bueno, a ver si alguien me puede ayudar:

la cosa es que estoy recibiendo por serie datos como estos, por ejemplo ..DA 11 21 C3..en hexadecimal, y parte de ellos los uso para enviar yo una respuesta. El problema es que no sé crear un array de char con el 0x delante. Me explico, manualmente me puedo crear esto:

Código: C++
  1. unsigned char inventario[8] =  {0xD6,0x00,0x05,0xFE,0x00,0x05,0xFA,0x40};
  2. WriteFile(hLCD, inventario, 8, &m, NULL);
  3.  
(no sé si se puede hacer de alguna forma mejor...)

Lo envio y todo bien. Luego a la respuesta que me llega le extraigo la parte de la trama que me interesa y la guardo en:

Código: C
  1. unsigned char sn[8];
  2.  

Ahora con lo que hay dentro de sn debo formar una nueva trama que debo enviar. ¿Pero como? He probado haciendo:

Código: C++
  1. unsigned char b;
  2.    
  3.     sprintf(b,"%c",0x40);
  4.  

pero no va bien, como se puede poner el 0x delante a un hexadeciamal que yo quiera y guardarlo en un array?

Lo que no sé es cómo se puede crear la matriz de ejemplo de arriba pero con datos que el programa va recibiendo? :brickwall:

No tendré que crear un montón de
Código: C
  1. #define                A4     0xA4
  2.  
  3.  
para luego usarlos... :argh:

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: hexadecimal en con 0x
« Respuesta #1 en: Miércoles 10 de Noviembre de 2010, 00:08 »
0
Creo que confundes conceptos. Ya tienes los números como quieres en tu array de unsigned char. Otra cosa es que cuando los imprimes por pantalla, salgan caracteres, pero el valor real sigue siendo el hexadecimal. Si quieres comprobar esto, prueba haciendo

Código: C
  1. for(i=0;i<8;i++)
  2.     printf("0x%X ", sn[i]);
  3.  
y verás cómo te imprime los valores hexadecimales.

O no te estoy entendiendo...

blasata

  • Miembro activo
  • **
  • Mensajes: 32
    • Ver Perfil
Re: hexadecimal en con 0x
« Respuesta #2 en: Miércoles 10 de Noviembre de 2010, 19:09 »
0
Bueno la cosa es todavia me hago un lio con los arrays.. :wacko:
A ver si hay una forma rápida de hacer esto: si un declaro un array de caracteres como este

Código: C
  1. char buffer[40];
  2.  

como puedo pasarlo a un array como este(con la idea de poder guardar numeros de 0..255..)

Código: C
  1. unsigned char Leer[40];
  2.  

en el que cada elemento se forme tomando de dos en dos de la cadena original.

O sea que si tengo por ejemplo:

Código: C
  1. Buffer[0]=65; // la A
  2. Buffer[1]=57;   // el 9
  3. Buffer[2]=48;  // el 0
  4. Buffer[3]=70;  // la F
  5.  
  6.  


pueda llegar a tener en 'Leer'  el primer elemento A9, 0F...
O si se puede, directamente en decimal, que seria 169, 15...
muchas gracias! :comp:

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: hexadecimal en con 0x
« Respuesta #3 en: Miércoles 10 de Noviembre de 2010, 21:04 »
0
EDITO: disculpa, borro mi respuesta, te he leído mal...

EDITO2: curioso problema. Me ha llevado un momento pensarlo, y te doy las gracias por el ejercicio  ^_^

No sé si habrá alguna solución más obvia, pero esto es lo más sencillo que se me ha ocurrido:

Código: C
  1. #include <stdio.h>
  2.  
  3. // Devuelve el valor representado por el digito hexadecimal pasado como parámetro
  4. // Para caracteres que no sean un dígito hexadecimal devuelve 0 (igual que para el dígito '0')
  5. unsigned char hextouc(char c)
  6. {
  7.     unsigned char r = 0;
  8.    
  9.     if (c >= 0x30 && c < 0x3A)
  10.     {
  11.         r = c - 0x30;
  12.     }
  13.     else if (c >= 0x41 && c < 0x4B)
  14.     {
  15.         r = c - 0x37;
  16.     }
  17.    
  18.     return r;
  19. }
  20.  
  21. int main()
  22. {
  23.     char a[2] = {'A', '9'};
  24.     unsigned char c;
  25.    
  26.     c = (hextouc(a[0]) << 4) + hextouc(a[1]);
  27.    
  28.     printf("%02Xn", c);
  29.     printf("%dn", c);
  30.    
  31.     return 0;
  32. }
  33.  
Si no entiendes algo del código, me preguntas  ;)

Ten en cuenta también que según tu ejemplo, Leer sólo contendría la mitad de elementos que buffer, ya que se necesitan dos elementos de buffer para formar uno de Leer. Por tanto con Leer[20] y buffer[40] vas perfectamente  ^_^

PD: cierto que hextouc() es fea, y me gustaría que alguien más propusiera una solución mejor, así aprendemos entre todos  :P

blasata

  • Miembro activo
  • **
  • Mensajes: 32
    • Ver Perfil
Re: hexadecimal en con 0x
« Respuesta #4 en: Viernes 12 de Noviembre de 2010, 17:41 »
0
guau, un momento solo?!!

muchas gracias es justo lo que andaba buscando, me estaba liando mucho ya...
 :beer:

Epa

  • Miembro MUY activo
  • ***
  • Mensajes: 242
  • Nacionalidad: ar
    • Ver Perfil
Re: hexadecimal en con 0x
« Respuesta #5 en: Viernes 12 de Noviembre de 2010, 21:19 »
0
Buenas.

En otro dia me pegue una mirada al foro, pero sin tiempo de responder.
Y aunque moskito ya te dio una solucion, te dejo otra por si sirve.

Lo pongo directamente con un ejemplo para que se entienda.

Código: C++
  1.  
  2. #define LEN 6
  3.  
  4. int i;
  5. char hexw[13] = "FF07A33700B9";
  6. unsigned int h;
  7. unsigned char hexn[LEN];
  8.  
  9. for(i = 0; i < LEN; i++)
  10. {
  11.     sscanf((hexw + 2*i), "%2X", &h);
  12.     hexn[i] = h;
  13. }
  14.  
  15.  

Saludos
The sweet smell of a great sorrow lies over the land.


m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: hexadecimal en con 0x
« Respuesta #6 en: Lunes 15 de Noviembre de 2010, 00:38 »
0
Con sscanf() no se me había ocurrido, aunque habría que ver el tiempo de ejecución de cada uno  :good: