Programación General > C/C++

 hexadecimal en con 0x

(1/2) > >>

blasata:
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++ ---unsigned char inventario[8] =  {0xD6,0x00,0x05,0xFE,0x00,0x05,0xFA,0x40};WriteFile(hLCD, inventario, 8, &m, NULL); (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 ---unsigned char sn[8]; 
Ahora con lo que hay dentro de sn debo formar una nueva trama que debo enviar. ¿Pero como? He probado haciendo:


--- Código: C++ ---unsigned char b;        sprintf(b,"%c",0x40);  
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 ---#define                A4     0xA4  para luego usarlos... :argh:

m0skit0:
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 ---for(i=0;i<8;i++)    printf("0x%X ", sn[i]); y verás cómo te imprime los valores hexadecimales.

O no te estoy entendiendo...

blasata:
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 ---char buffer[40]; 
como puedo pasarlo a un array como este(con la idea de poder guardar numeros de 0..255..)


--- Código: C ---unsigned char Leer[40]; 
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 ---Buffer[0]=65; // la ABuffer[1]=57;   // el 9Buffer[2]=48;  // el 0Buffer[3]=70;  // la F  

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:
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 ---#include <stdio.h> // Devuelve el valor representado por el digito hexadecimal pasado como parámetro// Para caracteres que no sean un dígito hexadecimal devuelve 0 (igual que para el dígito '0')unsigned char hextouc(char c){    unsigned char r = 0;        if (c >= 0x30 && c < 0x3A)    {        r = c - 0x30;    }    else if (c >= 0x41 && c < 0x4B)    {        r = c - 0x37;    }        return r;} int main(){    char a[2] = {'A', '9'};    unsigned char c;        c = (hextouc(a[0]) << 4) + hextouc(a[1]);        printf("%02Xn", c);    printf("%dn", c);        return 0;} 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:
guau, un momento solo?!!

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

Navegación

[0] Índice de Mensajes

[#] Página Siguiente

Ir a la versión completa