Convertir dos bytes menores de 16 en un byte que los contenga como nibbles

Iniciado por Sutano, 21 Agosto 2012, 03:38 AM

0 Miembros y 1 Visitante están viendo este tema.

Sutano

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
 

0xDani

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.
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

ecfisa

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.

Sutano

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

ecfisa

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.

Sutano

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

Saludos cordiales.

BlackZeroX

#6
@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!¡.
The Dark Shadow is my passion.

ecfisa

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

BlackZeroX

ooo si perdón no se donde demonios vi un &...

Dulces Lunas!¡.
The Dark Shadow is my passion.