Декодировать двоично-десятичное (BCD) в целое число без знака - PullRequest
6 голосов
/ 26 мая 2011

Значение, используемое в моем проекте, выражается 4-битными двоично-десятичными знаками (BCD), которые изначально сохранялись в символьном буфере (например, указывается указателем const unsigned char *).Я хочу преобразовать входной поток символов BCD в целое число.Не могли бы вы показать мне эффективный и быстрый способ сделать это?

Пример формата данных и ожидаемый результат:

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

Большое спасибо!

Ответы [ 2 ]

7 голосов
/ 26 мая 2011
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 здесь указывает количество байтов на входе, поэтому для примера, заданного OP, nybbles будет {0x97, 0x65}, а length будет 2.

5 голосов
/ 26 мая 2011

Вы можете расшифровать самую правую цифру следующим образом:

const unsigned int bcdDigit = bcdNumber & 0xf;

затем вы можете сместить число вправо, чтобы следующая цифра стала самой правой:

bcdNumber >>= 4;

Это даст вам цифры в неправильном порядке (справа налево). Если вы знаете, сколько у вас цифр, вы, конечно, можете извлечь нужные биты напрямую.

Используйте, например, (bcdNumber >> (4 * digitIndex)) & 0xf; для извлечения digitIndex: й цифры, где цифра 0 является самой правой.

...