字符串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
- 字符串Ascll格式转16进制
- 字符串16进制数字转换到Ascll字符串
- 进制-ASCLL-UNICODE问题
- 二进制字符串转换到Ascll字符串
- Ascll字符串转换到二进制字符串
- 字符转ASCLL码输出
- JAVA 接收键盘输入的字符串,转换成数组,输出ASCLL
- 字符串大小写逆置(神奇的ascll码)
- 字符串转时间格式
- 字符串转时间格式
- 字符串转UTF8格式
- time转字符串格式
- 字符串格式的xml转json格式
- js字符串转json格式
- js字符串转日期格式
- js字符串转日期格式
- JQuery 字符串转时间格式
- js字符串转日期格式
- 运算符号
- 1011. A+B和C (15)
- 二叉树的线索化
- 安装NodeJS、Vue
- 2016华成杯赛后总结
- 字符串Ascll格式转16进制
- shiro基础学习(二) shiro认证
- Linux学习笔记(2)
- kruskal模版 [结构体存图]
- linux下的进程组会话作业的概念
- Android WebView 与JS的数据交互
- Python输入 raw_input()/input() 与 sys.stdin.readline()的不同
- 压缩感知重构算法之正则化正交匹配追踪(ROMP)
- 给游戏任务换装备的代码心得