【问题标题】:BYTE BCD to ASCII conversion optimizationBYTE BCD 到 ASCII 转换优化
【发布时间】:2010-08-26 17:34:08
【问题描述】:

我用 c 语言编写了一个函数,将字节(无符号字符)BCD 字符串转换为 ASCII。请查看代码并提出一些改进建议。

有没有其他有效的方法可以将 BYTE BCD 转换为 ASCII。

BYTE_BCD_to_ASC(BYTE *SrcString, char *DesString)
{

        switch (((BCD *)SrcString)->l)
        {
            case 10:/*A*/
            case 11:/*B*/
            case 12:/*C*/
            case 13:/*D*/
            case 14:/*E*/
            case 15:/*F*/
                *DesString = (char)(((BCD *)SrcString)->l + '0' + 7);
                break;
            default:
                *DesString = (char)(((BCD *)SrcString)->l + '0');
                break;
        }

        switch (((BCD *)SrcString)->h)
        {
            case 10:
            case 11:
            case 12:
            case 13:
            case 14:
            case 15:
                *(DesString + 1) = (char)(((BCD *)SrcString)->h + '0' + 7);
                break;
            default:
                *(DesString + 1) = (char)(((BCD *)SrcString)->h + '0');
                break;
        }
    *(DesString + 2) = '\0';
}

谢谢

法哈尔

【问题讨论】:

    标签: c string ascii bcd


    【解决方案1】:

    我想我会这样做:

    void BCD2ASC(unsigned char src, char *dest) { 
        static const char outputs[] = "0123456789ABCDEF";
        *dest++ = outputs[src>>4];
        *dest++ = outputs[src&0xf];
        *dest = '\0';
    }
    

    【讨论】:

    • 据我了解,BCD 只包含 0 到 9 的数字,所以不需要 A - F。
    • @Thomas:不应该,但他的代码考虑到了这种可能性,所以我也这样做了。实际上,我似乎记得某些类型的 BCD 使用这些代码表示小数点以及 NaN 和 Infinity 的粗略等价物,但我不记得任何细节。在任何情况下,使用表查找都可以轻松地以任何您喜欢的方式处理它们。
    • 您也可以将outputs 数组设为const... 甚至只使用#define outputs "0123456789ABCDEF" ;)
    【解决方案2】:

    试试这个:

    void BCD_To_ASCII(unsigned char bcd_value, char * p_ascii_text)
    {
      //--------------------------------------------------
      // BCD contains digits 0 .. 9 in the binary nibbles
      //--------------------------------------------------
      *p_ascii_text++ = (bcd_value >> 4)  + '0';
      *p_ascii_text++ = (bcd_value & 0x0f) + '0';
      *p_ascii_text = '\0';
      return;
    }
    

    【讨论】:

    • @Jerry @Thomas,感谢您的回复,我相信现在我能够改进我的代码......
    • 请帮助我如何将Reverse-BCD的转换合并到例程中。
    • @Fakhar:请定义“反向 BCD”。
    • @Thomas,其实头文件中定义了两个结构体如下 #ifdef <b>IBM</b> #pragma option align=packed typedef struct { unsigned l : 4;无符号 h : 4; } BCD; typedef struct { 无符号 h : 4;无符号 l : 4; } BCD_REVERSE; #pragma option align=reset 现在我认为任何 BCD 数字都可以用两种格式表示,BCD 和 REVERSE-BCD,可能是 Reverse 应该是交换的半字节,但是有系统以这种格式发送时间。现在,我需要知道如何修改你的代码来处理这个 REVERSE 选项。
    • @Thomas,另一个定义如下 #elif defined(<b>COMPAQ</b>) typedef struct { unsigned char h : 4;无符号字符 l : 4; } BCD; typedef struct { unsigned char l : 4;无符号字符h:4; } BCD_REVERSE; #endif
    【解决方案3】:

    最后我实现了如下例程

    static const char s_szHexAscNo[] = "0123456789ABCDEF";
    
    void BYTE_BCD_to_ASC(BYTE *SrcString, char DesString[3], int BCDflag)
    {
        assert(SrcString != NULL);
        assert(DesString != NULL);
    
        if ( BCDFlag_Normal == BCDflag)
        {
            *DesString++ = (char) s_szHexAscNo[((BCD *)SrcString)->l];
            *DesString++ = (char) s_szHexAscNo[((BCD *)SrcString)->h];
        }
    
        if (BCDFlag_Reverse == BCDflag)
        {
            *DesString++ = (char) s_szHexAscNo[((BCD_REVERSE *)SrcString)->l];
            *DesString++ = (char) s_szHexAscNo[((BCD_REVERSE *)SrcString)->h];
        }
        *DesString = '\0';
    }
    
    /* BCD and BCD_REVERSE  are defined as */
    
    typedef struct
    {
    unsigned char    l : 4;
    unsigned char    h : 4;
    } BCD;
    
    typedef struct
    {
    unsigned char    h : 4;
    unsigned char    l : 4;
    } BCD_REVERSE;
    

    cmets 将不胜感激....

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-07-26
      • 2023-03-25
      • 1970-01-01
      • 2023-04-01
      • 2016-07-17
      • 2020-04-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多