字符串Ascll格式转16进制

来源:互联网 发布:iphone4s可以用4g网络 编辑:程序博客网 时间:2024/06/06 05:18

之前做过一些项目需要用到ASCLL码转换到16进制,在网上搜索后发现,大部分都是10进制数字转16进制数据,这对于8位字符类型unsignal char
(这里不用char,因为char是-127到128,对于129-255之间的数溢出变为负数,算起来稍微麻烦 ,采用unsignal char是因为它的值在0到255)
来讲他可以接收最大为255的数字(从Ascll码左边可以看到数字),市面上的转换方式大多都是一个char对应一个数字比如0-F,这对于char说浪费4位没有使用而且超过’f’范围的解析不了;

下面贴上手动实现的代码:

函数定义如下:

int charToHex(char* dst,const unsigned char* src,int len);

代码实现如下:

//第一个参数表示输出转换字符串 空间大小大大于 src的2倍//第2个参数表示输入字符串(ASCLL码)//第3个参数表示需要转换字符串长度int charToHex(char* dst,const unsigned char* src,int len){    if (0 == src)    {        return -1;    }    int nNum = 0;    const unsigned char*psrc = src;    for (int i = 0;i < len;i++)    {        int nval =  *(psrc + i);        if (15 >= nval && 0 <= nval)        {            if (9 >= nval && 0 <= nval)            {                *(dst + i * 2) = '0';                *(dst + i * 2 + 1) = '0' + nval;                nNum += 2;                continue;            }            switch (nval)//下面的算法中,把一个ascll字符转换为2个16进制数字,如果ascll小于F那么高位补0            {            case 10:                *(dst + i * 2) = '0';                *(dst + i * 2 + 1) = 'A';                break;            case 11:                *(dst + i * 2) = '0';                *(dst + i * 2 + 1) = 'B';                break;            case 12:                *(dst + i * 2) = '0';                *(dst + i * 2 + 1) = 'C';                break;            case 13:                *(dst + i * 2) = '0';                *(dst + i * 2 + 1) = 'D';                break;            case 14:                *(dst + i * 2) = '0';                *(dst + i * 2 + 1) = 'E';                break;            case 15:                *(dst + i * 2) = '0';                *(dst + i * 2 + 1) = 'F';                break;            }            nNum += 2;        }        else if (255 >= nval &&15 < nval)        {            int nRun = nval / 16;            int nRem = nval%16;            switch (nRun)            {            case 10:                *(dst + i * 2) = 'A';                break;            case 11:                *(dst + i * 2) = 'B';                break;            case 12:                *(dst + i * 2) = 'C';                break;            case 13:                *(dst + i * 2) = 'D';                break;            case 14:                *(dst + i * 2) = 'E';                break;            case 15:                *(dst + i * 2) = 'F';                break;            }            if (9 >= nRun)            {                *(dst + i * 2) = '0' + nRun;                nNum ++;            }            else            {                nNum ++;            }            if (9 >= nRem)            {                *(dst + i * 2 + 1) = '0' + nRem;                nNum ++;                continue;            }            switch (nRem)//个位            {            case 10:                *(dst + i * 2 + 1) = 'A';                break;            case 11:                *(dst + i * 2 + 1) = 'B';                break;            case 12:                *(dst + i * 2 + 1) = 'C';                break;            case 13:                *(dst + i * 2 + 1) = 'D';                break;            case 14:                *(dst + i * 2 + 1) = 'E';                break;            case 15:                *(dst + i * 2 + 1) = 'F';                break;            }            nNum ++;        }        else        {            *(dst + i * 2) = '0';            *(dst + i * 2 + 1) = '0';            nNum += 2;        }    }    return nNum;}

实现原理:
1.根据8位ascll码(unsignal char)最大255,转换成16进制为FF。
2.每4位表示一个16进制数字,如果ascll码小于等于F也就是只有低4位,那么16进制高位补零。

下一章讲解16进制转换Ascll格式方法!

2 0
原创粉丝点击