Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
字节BCD到ASCII转换优化_C_String_Ascii_Bcd - Fatal编程技术网

字节BCD到ASCII转换优化

字节BCD到ASCII转换优化,c,string,ascii,bcd,C,String,Ascii,Bcd,我用c编写了一个函数,它将字节(无符号字符)BCD字符串转换为ASCII。请查看代码并提出一些改进建议 是否有其他有效的方法可以将字节BCD转换为ASCII BYTE_BCD_to_ASC(BYTE *SrcString, char *DesString) { switch (((BCD *)SrcString)->l) { case 10:/*A*/ case 11:/*B*/ ca

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

是否有其他有效的方法可以将字节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';
}
谢谢


法哈尔

我想我应该这样做:

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

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;
}

最后,我实现了如下例程

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;

如有评论,我将不胜感激。…

据我所知,BCD仅包含0到9之间的数字。所以不需要A-F。托马斯:不应该,但是他的代码考虑了这种可能性,所以我也考虑了。事实上,我似乎回忆起某些类型的BCD,使用这些代码表示小数点以及NaN和无穷大的粗略等价物,但我不记得任何细节。在任何情况下,使用表查找都可以轻松地按您喜欢的方式处理这些内容。您还可以使
输出
数组
常量
。。。甚至只需使用
#定义输出“0123456789ABCDEF”
)@Jerry@Thomas,谢谢您的回复,我相信现在我可以改进我的代码了……请帮助我如何将反向BCD的转换纳入例程。@Fakhar:请定义“反向BCD”。@Thomas,实际上,头文件中定义了两种结构,如下所示
#ifdef IBM#pragma option align=packed typedef struct{unsigned l:4;unsigned h:4;}BCD;typedef结构{无符号h:4;无符号l:4;}BCD_反向#pragma option align=reset
现在,我认为任何BCD数字都可以用两种格式表示,BCD和REVERSE-BCD,可能是相反的,应该用交换的半字节表示,但是这种格式中有系统发送时间。现在,我需要知道如何修改代码来处理这个反向选项。@Thomas,另一个定义如下
#elif defined(COMPAQ)typedef struct{unsigned char h:4;unsigned char l:4;}BCD;typedef结构{unsigned char l:4;unsigned char h:4;}BCD_REVERSE#endif