Hola a todos. Este es mi primer post en el foro elhacker.net
Por favor, necesito ayuda con el codigo base del siguiente problema:
Como programar en C++ un lazo que ciclicamente lee dos bytes (cada uno de estos bytes con valores entre 0 y 15), y convierte ambos bytes en un unico byte de 0 a 256, manipulando los dos bytes como nibbles.
Entiendo que debo desplazar 4 veces uno de los bytes y sumarlo al otro byte.
Por ejemplo, si los bytes son A=12 (00001100) y B=14 (00001110), deberia poder convertirlos en C = 206 (11001110) donde estan contenidos.
Gracias por adelantado,
Wilfredo
Mira este post, fijate en las funciones be16, be32 y be64, y en la magnifica explicacion que me dio @Alex Mtx, creo que te sera util: http://foro.elhacker.net/programacion_cc/ayuda_con_este_codigo-t368590.0.html
Saludos.
Hola Sutano.
CitarPor ejemplo, si los bytes son A=12 (00001100) y B=14 (00001110), deberia poder convertirlos en C = 206 (11001110) donde estan contenidos.
Si no te entendí mal, podrías hacer:
...
unsigned char A=12, B=14, C;
C = A << 4 | B;
...
Saludos.
Gracias Daniyo y Ecfisa. Tu propuesta, Ecfisa, es la solucion mas directa. Hasta ahora habia pensado en C= ( A<<4 ) + B. Pienso que tambien funciona. por cierto que tuve que resolver el caso contrario. Recuperar los nibbles del byte. Esto es lo que hice:
B = (C >> 4)
A = (C - ((C >> 4)<<4)
No lo he probado pero creo que para A es mas directo:
A = C && 0x0F
Saludos
Hola Sutano.
Ejemplo:
#include <stdio.h>
int main(int argc, char* argv[]) {
unsigned char hinibble = 0xE, lonibble = 0xC, BYTE;
/* Nibbles a byte */
BYTE = hinibble << 4 | lonibble;
printf("%X\n",BYTE);
/* Byte a nibbles */
hinibble = BYTE >> 4;
lonibble = BYTE & 0xF;
printf("%X%X",hinibble, lonibble);
getchar();
return 0;
}
Saludos.
Gracias de nuevo ecfisa por el codigo. Con un codigo similar al tuyo, he optimizado el codigo existente en un pequeno sistema en el cual trabajo. Te anexo un video del sistema. Se trata de un control remoto por joystick de un robot Pololu 3pi usando modulos XBee. Actualmente trabajo en el codigo C del modulo microcontrolador MM51C2 de Bipom para eliminar la laptop que actualmente uso como puente.
http://www.youtube.com/watch?v=UmourpBmrLQ&feature=plcp (http://www.youtube.com/watch?v=UmourpBmrLQ&feature=plcp)
Saludos cordiales.
@ecfisa
Las mascaras 0xE, 0xC son erróneas...
int fusion_nibble(int low, int upper) { // Solo nos interesan los bits por ello no importa si son unsigned o signed... tampoco nos interesan el tipo...
return (low & 0xF) | ((upper << 4) & 0xF0); // usamos las mascaras para no alterar valores...
}
int main() {
char a = 12, b = 14;
printf("%d\n", (unsigned)fusion_nibble(b, a));
getchar();
return 0;
}
Dulces Lunas!¡.
Hola BlackZeroX.
No utilizo los valores como máscaras, sino para inicializar las variables hinibble y lonibble (0xE = 14 y 0xC = 12).
Saludos.
Pd: Estaba editando, pero fuí muy lento... (estoy medio verde con el editor) :-( y respondiste primero ;D
ooo si perdón no se donde demonios vi un &...
Dulces Lunas!¡.