Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: Sutano en 21 Agosto 2012, 03:38 am



Título: Convertir dos bytes menores de 16 en un byte que los contenga como nibbles
Publicado por: Sutano en 21 Agosto 2012, 03:38 am
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
 


Título: Re: Convertir dos bytes menores de 16 en un byte que los contenga como nibbles
Publicado por: 0xDani en 21 Agosto 2012, 13:40 pm
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.


Título: Re: Convertir dos bytes menores de 16 en un byte que los contenga como nibbles
Publicado por: ecfisa en 21 Agosto 2012, 20:11 pm
Hola Sutano.

Citar
Por 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:

Código
  1. ...
  2.  unsigned char A=12, B=14, C;
  3.  
  4.  C = A << 4 | B;  
  5. ...
  6.  

Saludos.


Título: Re: Convertir dos bytes menores de 16 en un byte que los contenga como nibbles
Publicado por: Sutano en 21 Agosto 2012, 21:18 pm
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


Título: Re: Convertir dos bytes menores de 16 en un byte que los contenga como nibbles
Publicado por: ecfisa en 22 Agosto 2012, 05:04 am
Hola Sutano.

Ejemplo:

Código:
#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.


Título: Re: Convertir dos bytes menores de 16 en un byte que los contenga como nibbles
Publicado por: Sutano en 24 Agosto 2012, 05:12 am
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.


Título: Re: Convertir dos bytes menores de 16 en un byte que los contenga como nibbles
Publicado por: BlackZeroX en 24 Agosto 2012, 05:58 am
@ecfisa
Las mascaras 0xE, 0xC son erróneas...

Código
  1.  
  2. 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...
  3.    return (low & 0xF) | ((upper << 4) & 0xF0); // usamos las mascaras para no alterar valores...
  4. }
  5.  
  6. int main() {
  7.  
  8.    char a = 12, b = 14;
  9.  
  10.    printf("%d\n", (unsigned)fusion_nibble(b, a));
  11.    getchar();
  12.    return 0;
  13. }
  14.  
  15.  

Dulces Lunas!¡.


Título: Re: Convertir dos bytes menores de 16 en un byte que los contenga como nibbles
Publicado por: ecfisa en 24 Agosto 2012, 07:35 am
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


Título: Re: Convertir dos bytes menores de 16 en un byte que los contenga como nibbles
Publicado por: BlackZeroX en 24 Agosto 2012, 07:48 am
ooo si perdón no se donde demonios vi un &...

Dulces Lunas!¡.