Двоично-десятичное преобразование (BCD) в шестнадцатеричное - PullRequest
7 голосов
/ 21 декабря 2010

Может кто-нибудь объяснить мне, как преобразовать BCD в шестнадцатеричный?Например, как я могу преобразовать 98 (BCD) в шестнадцатеричное.Спасибо.

Ответы [ 5 ]

9 голосов
/ 21 декабря 2010

Я не совсем понимаю ваш вопрос, но я предполагаю, что, например, кто-то дает вам число 98, закодированное в BCD, которое будет:

1001 1000

и вы должны получить:

62H

Что бы я предложил:

1) преобразовать закодированное в BCD значение в десятичное значение (D)

2) преобразовать D в шестнадцатеричное значение.

В зависимости от того, какой язык программирования вы выберете, эта задача будет проще или сложнее.

РЕДАКТИРОВАТЬ: В Java это может быть:

    byte bcd = (byte)0x98; // BCD value: 1001 1000

    int decimal = (bcd & 0xF) + (((int)bcd & 0xF0) >> 4)*10;

    System.out.println(
            Integer.toHexString(decimal)
    );
9 голосов
/ 21 декабря 2010

BCD - это подмножество шестнадцатеричного числа, поэтому преобразование не требуется - любое заданное значение BCD идентично соответствующему шестнадцатеричному значению. Например, «98» в BCD - это 10011000, что равно 98 в шестнадцатеричном

3 голосов
/ 22 февраля 2012

Для любого кодированного значения BCD (которое будет помещаться в int).

Итеративный:

unsigned int bcd2dec(unsigned int bcd)
{
    unsigned int dec=0;
    unsigned int mult;
    for (mult=1; bcd; bcd=bcd>>4,mult*=10)
    {
        dec += (bcd & 0x0f) * mult;
    }
    return dec;
}

Рекурсивный:

unsigned int bcd2dec_r(unsigned int bcd)
{
    return bcd ? (bcd2dec_r(bcd>>4)*10) + (bcd & 0x0f) : 0; 
}
2 голосов
/ 21 декабря 2010

Переход между различными комбинациями шестнадцатеричного, десятичного и двоичного значений.Если вы знаете, как работает бинарный файл, тогда вы легко сможете использовать BCD:

Hex  Dec  BCD
0    0    0000
1    1    0001
2    2    0010
3    3    0011
4    4    0100
5    5    0101
6    6    0110
7    7    0111
8    8    1000
9    9    1001
A   10    0001 0000 <-- notice that each digit looks like hex except it can only go to 9.
B   11    0001 0001
C   12    0001 0010
D   13    0001 0011
E   14    0001 0100
F   15    0001 0101

После того, как вы разберетесь с этой частью, вы сможете использовать деление на 10 или% 10 для поиска любой комбинациигенерировать свой BCD.Поскольку он использует только 10 комбинаций вместо всех 16, вы потеряете некоторую информацию.

2 голосов
/ 21 декабря 2010

Я бы создал таблицу из 256 записей, отображающую все байты BCD в их двоичный эквивалент;затем вы можете использовать шестнадцатеричную печать вашего языка программирования.

...