压缩BCD 码转化为十进制数,编程求解

数值输入01 20 00 00,为压缩BCD 码,均为16进制,第一个字节的高位 0 为符号位(0 正,1 负)020 为三 位整数值,10 00 为四位小数值。解析为 +120.100同理10 05 25 00解析为-5.25;该怎么写代码啊,求解

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 建议你看下这篇博客👉 :什么是 BCD(二进制编码的十进制)
  • 除此之外, 这篇博客: 什么是 BCD(二进制编码的十进制)中的 如何转换为BCD 部分也许能够解决你的问题, 你可以仔细阅读以下内容或者直接跳转源博客中阅读:

    如何转换为BCD,相对简单。只要根据数值的大小加上6的倍数就可以了。检查运算结果,如果数量大于9,则加6。如果不到9,我什么都不会做。

     要在BCD中表示大于9的数字,需要二进制数的八位数,因此前四位数字将被添加。在大于9的数字上加上6,必定会在第四位数发生进位。这个进位叫半进位。在微型计算机内部执行BCD转换操作时,通过检查半进位来确定大于9的数。

    半进位是CCR(Condition Code Register:条件码寄存器)的H(半进位)。

    您可以通过将6添加到十进制的9到15,即十六进制的A到F,将其转换为BCD。此外,更大的数字转换方法如下表所示。这里显示的是十进制数的10到39(十六进制的A到27)。十进制数的10到19的情况下加6,20到29的情况下加12,30到39的情况下加18。这样,通过根据数量的大小加上6的倍数,就可以很容易地转换成BCD。

     例如,考虑一下微型计算机中内置的实时时钟(以下简称RTC:Real Time Clock)处理的数字。
    RTC是一种时间时钟定时器,可实现时钟和日历功能。计算分钟和秒的最大值为59。时间最大值为12或24。因此,您可以将转换为BCD的最大值限制为59或24。也就是说,即使用普通BCD表示2位数,也可以用6位或7位来表示,而不需要仅限于RTC的所有8位。此外,您还可以在1位和10位之间进行转换,从而优化硬件逻辑规模。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^

参考GPT和自己的思路,以下是C语言的代码实现:

#include <stdio.h>

float bcd_to_decimal(unsigned char bcd_bytes[], int length)
{
    float result = 0.0;
    int i;
    for(i=0; i<length; i++)
    {
        result = 10 * result + ((bcd_bytes[i] >> 4) & 0x0F) * 1 + (bcd_bytes[i] & 0x0F) * 0.1;
    }
    return result;
}

float compressed_bcd_to_decimal(unsigned char compressed_bcd_bytes[])
{
    // 获取符号位
    int sign = ((compressed_bcd_bytes[0] >> 7) & 0x01) ? -1 : 1;
    // 获取整数值
    unsigned int integer = ((compressed_bcd_bytes[0] & 0x7F) << 8) + compressed_bcd_bytes[1];
    // 获取小数值
    unsigned int decimal = (compressed_bcd_bytes[2] << 8) + compressed_bcd_bytes[3];
    // 将整数值和小数值分别转换为十进制数
    float integer_decimal = bcd_to_decimal((unsigned char*)&integer, 2);
    float decimal_decimal = bcd_to_decimal((unsigned char*)&decimal, 2);
    // 计算最终结果
    float result = sign * (integer_decimal + decimal_decimal);
    return result;
}

int main()
{
    unsigned char bcd_bytes_1[] = {0x01, 0x20, 0x00, 0x00};
    unsigned char bcd_bytes_2[] = {0x10, 0x05, 0x25, 0x00};
    printf("bcd_bytes_1 = 0x%02x%02x%02x%02x, decimal = %f\n", bcd_bytes_1[0], bcd_bytes_1[1], bcd_bytes_1[2], bcd_bytes_1[3], compressed_bcd_to_decimal(bcd_bytes_1));
    printf("bcd_bytes_2 = 0x%02x%02x%02x%02x, decimal = %f\n", bcd_bytes_2[0], bcd_bytes_2[1], bcd_bytes_2[2], bcd_bytes_2[3], compressed_bcd_to_decimal(bcd_bytes_2));
    return 0;
}

该代码使用了两个函数,bcd_to_decimal 用于将单个BCD码转化为十进制数,compressed_bcd_to_decimal 用于将压缩BCD码转化为十进制数。在 compressed_bcd_to_decimal 函数中,首先获取符号位、整数值和小数值,然后分别将整数值和小数值转化为十进制数,并计算最终结果。最后,在 main 函数中,我们分别测试了两个压缩BCD码的转化结果。
回答不易,还请采纳!!!

https://it.cha138.com/ios/show-33397.html