Programación General => C/C++ => Mensaje iniciado por: blasata en Martes 9 de Noviembre de 2010, 20:52
Título: hexadecimal en con 0x
Publicado por: blasata en Martes 9 de Noviembre de 2010, 20:52
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:
(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
unsignedchar 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++
unsignedchar 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:
Título: Re: hexadecimal en con 0x
Publicado por: m0skit0 en Miércoles 10 de Noviembre de 2010, 00:08
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
y verás cómo te imprime los valores hexadecimales.
O no te estoy entendiendo...
Título: Re: hexadecimal en con 0x
Publicado por: blasata en Miércoles 10 de Noviembre de 2010, 19:09
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
unsignedchar 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 A
Buffer[1]=57;// el 9
Buffer[2]=48;// el 0
Buffer[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:
Título: Re: hexadecimal en con 0x
Publicado por: m0skit0 en Miércoles 10 de Noviembre de 2010, 21:04
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')
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
Título: Re: hexadecimal en con 0x
Publicado por: blasata en Viernes 12 de Noviembre de 2010, 17:41
guau, un momento solo?!!
muchas gracias es justo lo que andaba buscando, me estaba liando mucho ya... :beer:
Título: Re: hexadecimal en con 0x
Publicado por: Epa en Viernes 12 de Noviembre de 2010, 21:19
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++
#define LEN 6
int i;
char hexw[13]="FF07A33700B9";
unsignedint h;
unsignedchar hexn[LEN];
for(i =0; i < LEN; i++)
{
sscanf((hexw +2*i), "%2X", &h);
hexn[i]= h;
}
Saludos
Título: Re: hexadecimal en con 0x
Publicado por: m0skit0 en Lunes 15 de Noviembre de 2010, 00:38
Con sscanf() no se me había ocurrido, aunque habría que ver el tiempo de ejecución de cada uno :good: