字符串Ascll格式转16进制
2017-03-27 22:00
113 查看
之前做过一些项目需要用到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’范围的解析不了;
下面贴上手动实现的代码:
函数定义如下:
代码实现如下:
实现原理:
1.根据8位ascll码(unsignal char)最大255,转换成16进制为FF。
2.每4位表示一个16进制数字,如果ascll码小于等于F也就是只有低4位,那么16进制高位补零。
下一章讲解16进制转换Ascll格式方法!
(这里不用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格式方法!
相关文章推荐
- 我是运营,我没有假期
- DB2数据库的安装
- C#实现把指定数据写入串口
- “传奇”图象数据存储方式
- 修复mysql数据库
- 浅析SQL数据操作语句
- SQLServer 数据导入导出的几种方法小结
- 简述MySQL分片中快速数据迁移
- MySQL数据备份之mysqldump的使用详解
- C#实现窗体间传递数据实例
- Vue监听数据对象变化源码
- C#中的委托数据类型简介
- SQL Server删除表及删除表中数据的方法
- SqlServer2008误操作数据(delete或者update)后恢复数据的方法
- 给你的数据库文件减肥
- 直接拷贝数据文件实现Oracle数据迁移
- Oracle数据更改后出错的解决方法
- Oracle数据库数据丢失恢复的几种方法总结
- Ajax点击不断加载数据列表
- 详解Node.Js如何处理post数据