C++中的字符转换

        关于C++中实现这符转换的函数占用这个位置好久了,一直没有时间来写,最近也没搞开发了,所以以前的一些拿出来总结下,免得自己忘记。

 

        1、字符转换成十六进制码(这里的参数是一次转换两个字符) 
        #define MarcoHex(x,y) (x>'9'?x-'7':x-'0')<<4 + (y>'9'?y-'7':y-'0');调用这个宏,这里szStr = "FF",int nHex = MarcoBCD(szStr[0],szStr[1])后,nHex = 0xFF;

 

        2、整形转换成BCD码:

        int型数据为四个字节,数据很大,先考虑10分位的数据;int x = 12,我们只需要进行下面转换就可以得到10分位的BCD码:char y = (x/10)<<4 + x%10,此时y的值便是0x12;

 

        3、字符串转换成BCD码(字符串将每两个字符存入一个BCD字符)

        int bcd(char *_src, int _ln, char *_dst)
        {
              int ln;
              BYTE *szbuz = new BYTE[_ln + 128];

              assert(NULL != szbuz);
              BYTE *dst = szbuz;
              BYTE *src = _src;

              for(; *src; src++) { *src = toupper( *src );}
              src = _src;

              for( ln = 0; ln < _ln; ln += 2, src++, dst++)
              {
                     *dst = CheckNumber(*src) << 4;
                     src++;
                     *dst += CheckNumber(*src);
               }

               ln = dst - szbuz;
               memcpy(_dst, szbuz, ln);

               delete[] szbuz;
               return ln;
        }

 

 

 

        4、反转函数

WORD ReverseWORD(WORD src)

{

#define CSHORT(x) (((x) & 0x00FF) << 8) + (((x) & 0xFF00) >> 8)

    return CSHORT(src);

}

//---------------------------------------------------------------------------

DWORD ReverseDWORD(DWORD src)

{

#define CLONG(x) (((x) & 0x000000FF) << 24 ) + (((x) & 0x0000FF00) << 8 ) /

      + (((x) & 0x00FF0000) >> 8 ) + (((x) & 0xFF000000) >> 24 )

    return CLONG(src);

        }

//---------------------------------------------------------------------------

 

void ReversePCHAR(char *p, const int len )

{

    char* szbuz = (char*)malloc( len + 1 );

    memcpy(szbuz,p,len);

    for( int i = 0 ; i < len ; i ++)

    {

        p[len - i - 1] = szbuz[i];

    }

    free(szbuz);

        }

//---------------------------------------------------------------------------

WORD BCD2WORD(const WORD src)

{

#define B2I(x) (((((x) & 0xF0) >> 4) * 10) + ((x) & 0x0F))

    return B2I(src);

}

//---------------------------------------------------------------------------

DWORD SecondTimer()

{

    LARGE_INTEGER count, freq, ns;

   

    QueryPerformanceFrequency(&freq);

    QueryPerformanceCounter( &count );

   

    ns.QuadPart =  count.QuadPart / freq.QuadPart;

    return ns.LowPart;

}

//---------------------------------------------------------------------------

short INT2BCD(const short src)

{

#define I2B(x) (((x % 100) / 10) << 4) + ((x % 100) % 10)   

    return I2B(src);   

}

//---------------------------------------------------------------------------

void PCHAR2BCD(const char *src, char *dest, int len)

{

    char *szbuz = new char[len + 1];

    memcpy(szbuz, src, len);

   

    char *point = szbuz;

 

    for( int i = 0; i < len; i += 2)

    {

        *point = toupper(*point);

 

        if(( *point <= '9' ) && (*point >= '0'))

            *dest = (*point - '0') << 4;

        else if(( *point <= 'F' ) && (*point >= 'A'))

            *dest = (*point - '7') << 4;

        else *dest = 0;

 

        point++;

        *point = toupper(*point);

 

        if(( *point <= '9' ) && (*point >= '0'))

            *dest += (*point - '0') ;

        else if(( *point <= 'F' ) && (*point >= 'A'))

            *dest += (*point - '7') ;

        else *dest += 0;

 

        point++;

        dest++;

    }

    delete[] szbuz;

}

//---------------------------------------------------------------------------

int PCHAR2BIN(char *src, unsigned int len)

{

    int result = 0;

    len = len > strlen(src) ? strlen(src):len;

    for(unsigned int i = 0 ;i < len ;i ++ )

    {       

        result += src[len - i - 1] == '1' ? 1 :0 ;

        if (i < len - 1)

            result = result << 1;

    }

    return result;

      

}

//---------------------------------------------------------------------------

void BIN2PCHAR(char *dest, const int src)

{

    int x = src;

    int len = sizeof(src) * 8 ;

    char *p = dest + len - 1;

    for(int i = 0 ; i < len; i ++)

    {

        *p-- = (x & 0x01) + 0x30;

        x = x >> 1;

    }

}

//---------------------------------------------------------------------------

void PCHAR2HEX(char *dest, const char * src, int len)

{

    if( !len ) len = strlen(src);

    while(len -- )

    {

        sprintf(dest,"%02x",*src++);

        dest += 2;

    }

}

//---------------------------------------------------------------------------

void SplitPCHAR(char ** dest, char * src, DWORD nlen)

{

    unsigned int clen = strlen(src);

    do

    {

        memcpy(*dest++,src,nlen < strlen(src) ? nlen: strlen(src));

        src += nlen;

    }

    while ( clen - nlen );

}

//---------------------------------------------------------------------------

我不认为上述函数有实用价值,特别对于上层软件的开发,很多功能都将我所陈述的内容实现要更高效,更安全,这只不过是一种方式去了解它们而已。

 

 

没有初始的指针是没有意义的,sizeof不能用于获取动态数组的大小;

如查要获得一个指针地址所指向的字符串的长度,应该使用strlen;

取得指针地址的长度是sizeof((int)&ptr);

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值