2011-05-26 34 views
6

El valor utilizado en mi proyecto se expresa con decimales codificados en binario (BCD) de 4 bits, que originalmente se almacenaron en un búfer de caracteres (por ejemplo, apuntado por un puntero const unsigned char *) . Quiero convertir la corriente BCD char de entrada en un entero. ¿Podría mostrarme una forma eficiente y rápida de hacerlo?Decodificar decimal codificado en binario (BCD) a entero sin signo

datos de ejemplo formato y resultado esperado:

BCD*2; 1001 0111 0110 0101=9765 
     "9" "7" "6" "5" 

Muchas gracias!

+2

posible duplicado de [forma más eficiente para convertir BCD a binario] (http://stackoverflow.com/questions/462970/most-efficient-way-to-convert-bcd-to-binary) –

+0

@Bo Persson: que publica en C#, no C++ – forsvarir

+0

@forsvarir: Para el principio general de cómo hacerlo, una solución C# es tan buena como cualquier otra. Sin embargo, creo que mi solución es probablemente más compacta que cualquiera de los que están en ese hilo. :-) –

Respuesta

7
unsigned int lulz(unsigned char const* nybbles, size_t length) 
{ 
    unsigned int result(0); 
    while (length--) { 
     result = result * 100 + (*nybbles >> 4) * 10 + (*nybbles & 15); 
     ++nybbles; 
    } 
    return result; 
} 

length aquí especifica el número de bytes en la entrada, así que para el ejemplo dado por el PO, nybbles habría {0x97, 0x65} y length habría 2.

+0

Muchas gracias a Chris Jester-Young. Comparé tu solución con la mía. Tu solución es más rápida. Usé "pow" en el ciclo while. –

5

Usted puede descifrar el dígito más a la derecha de este modo:

const unsigned int bcdDigit = bcdNumber & 0xf; 

entonces usted puede cambiar el número a la derecha, por lo que el siguiente dígito más a la derecha se convierte en el:

bcdNumber >>= 4; 

Esta voluntad sin embargo, te da los dígitos en el orden incorrecto (de derecha a izquierda). Si sabe cuántos dígitos tiene, puede, por supuesto, extraer los bits correctos directamente.

Usar p. Ej. (bcdNumber >> (4 * digitIndex)) & 0xf; para extraer el digitIndex: dígito th, donde el dígito 0 es el más a la derecha.

+0

Estimado desenrollado,
Gracias por su rápida respuesta. Mi plantilla de función de conversión debería tener esto como
unsigned int BCDn (unsigned int n, const unsigned char * data)
donde "const unsigned char *" es un puntero apuntado a un buffer de caracteres para decimales codificados en binario de 4 bits. Por ejemplo:
const unsigned char * data = "1001011101100101";

Cuestiones relacionadas