十六进制转换成字符串——CRC
继前天的,完成了计算阶乘,今天计算CRC32。
本来将数字转换成字符串直接使用sprintf就可以了,我在PC上也这样用,没问题。但我对DSP完全不熟悉,在DSP端的代码中使用如sprintf这些函数,结果没有得到预期效果,DSP应该不能使用这些函数吧?(注:可以使用,没得到预期效果是因为对内存操作错误造成的。)
没办法,只好自己写一个,参考网上的十进制转换字符串的做法,代码如下:
void hex_to_string(unsigned int num, char *str)
{int i = 0;int n = 0;char tmp;if (num == 0){str[0] = '0';str[1] = '\0';return;}while (num > 0){tmp = num % 16;if (tmp >= 0 && tmp <= 9)str[n] = tmp + '0';else if (tmp >= 10 && tmp <= 15)str[n] = tmp + 'A' - 0x0a;num /= 16;n++;}for (i = 0; i < n / 2; i++){tmp = str[i];str[i] = str[n - i - 1];str[n - i - 1] = tmp;}str[n] = '\0';
}
函数的目的是将计算好的CRC32值转换成字符串形式,发送到ARM端。
有几个说明:
1、十进制、十六进制在内存中表现完全一样,只是printf使用不同的输出格式就得到不同的进制。传入的参数是无符号类型,如果是有符号的,结果是不正确的,像“hello world.”的CRC32值是930BDFFC,用printf的%d和%u打印的结果是不同的,如下:
930BDFFC -1827938308 2467028988
只能说,这个数就在内存中,你是有符号,还是无符号,数还是那个数,数就在那里。
2、将十进制转换成十六进制就是将十进制数除以16,取余数。这里是放到数组中,当然是ASCII码了。所以要做一个判断,当余数为0~9范围内时,说明是数字0~9,对应的ASCII码就是将这个数加上48,48、0x30、'0'都是一样的,为了阅读的方便,代码中写成'0'。当余数为10~15时,就是十六进制的'A'~'F',至于为什么要减去10,因为前面10个数是数字,不是字母。
3、上面得到的结果是反的,所以要倒过来放。为什么是反的,试一下就知道了。
4、还是前天说的,没有手动搞个'\0'上去,就不算正常的字符串,打印出来的结果会连着后面的数据。在PC上没有这种情况发生,但在DSP上,它就是发生了。不知道这个疑问到什么时候才能解决。
5、如果要提高所谓的效率,可以将tmp = num % 16;改为tmp = num & 0xf;的形式,将num /= 16;改为num >>= 4;的形式。
测试结果:
# ./loopgpp_new loop_new.out "http://www.latelee.org"
the string you input: http://www.latelee.org
string: http://www.latelee.org crc32: 7D696766 7D696766
=============== Sample Application : LOOP ==========
Entered LOOP_Create ()
Leaving LOOP_Create ()
Entered LOOP_Execute ()
crc: 7D696766
37 44 36 39 36 37 36 36 0 77 2e 6c 61 74 65 6c 65 65 2e 6f 72 67 0 64 2e 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
end. buffer size: 128 LOOP_NumIterations: 1
Leaving LOOP_Execute ()
Entered LOOP_Delete ()
Leaving LOOP_Delete ()
====================================================
再来一个:
# ./loopgpp_new loop_new.out "hello world."
the string you input: hello world.
string: hello world. crc32: 930BDFFC 930BDFFC
=============== Sample Application : LOOP ==========
Entered LOOP_Create ()
Leaving LOOP_Create ()
Entered LOOP_Execute ()
crc: 930BDFFC
39 33 30 42 44 46 46 43 0 6c 64 2e 0 74 65 6c 65 65 2e 6f 72 67 0 64 2e 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
end. buffer size: 128 LOOP_NumIterations: 1
Leaving LOOP_Execute ()
Entered LOOP_Delete ()
Leaving LOOP_Delete ()
====================================================
上面将128个字节的缓冲区打印出来是为了更清楚里面到底是些什么东西。
PS:话说小弟接触硬件也有两三年了,CRC是知道的,但一直没有从代码上理解,前不久才在一个偶然的机会学习,代码主要来自zlib,u-boot中的crc校验也是修改自zlib,我的是综合网络资源、zlib、u-boot三者搞出来的。
十六进制转换成字符串——CRC相关推荐
- c语言中将整数转换成字符串_在C语言中将ASCII字符串(char [])转换为十六进制字符串(char [])...
c语言中将整数转换成字符串 Given an ASCII string (char[]) and we have to convert it into Hexadecimal string (char ...
- C#:十六进制字节数组 转换成 字符串、字符串形式的16进制数据 转换成 十六进制字节数组
十六进制字节数组 转换成 字符串 /// <summary>/// 十六进制字节数组 转换成 字符串/// </summary>/// <returns></ ...
- linux c十六进制转十进制函数,用Linux/Unix命令把十六进制转换成十进制(转)
那天写个脚本,需要把十六进制的数字转成十进制的打出来,发现不知道要怎么弄,搜一下,原来还是很简单的,比用C语言什么的容易多了,就一些现成的命令就解决了. 先列两种简单的方法: 1) echo 自己就能 ...
- js 转化为实体符_js字符串转换成数字与数字转换成字符串的实现方法
本篇文章主要是对js字符串转换成数字与数字转换成字符串的实现方法进行了详细的介绍,需要的朋友可以过来参考下,希望对大家有所帮助 js字符串转换成数字 将字符串转换成数字,得用到parseInt函数. ...
- java大数转换成字符串,js字符串转换成数字与数字转换成字符串的实现方法
摘要:这篇JavaScript栏目下的"js字符串转换成数字与数字转换成字符串的实现方法",介绍的技术点是"js字符串.字符串转换.实现方法.数字转换.字符串.转换&qu ...
- Shell 十六进制转换成二进制的方案
十六进制转换成二进制的方案 代码如下: #/bin/bash Hex2Bin(){ local string=$1 if [[ -z $string ]]; then ...
- php数组转字符串 join,jQuery中将数组转换成字符串join()和push()使用
1.push()将元素依次添加至数组: 2.join()将数组转换成字符串,里面可以带参数分隔符,默认[,] $(document).on('click','.sure',function(){ va ...
- json字符串转换成json对象,json对象转换成字符串,值转换成字符串,字符串转成值...
json字符串转换成json对象,json对象转换成字符串,值转换成字符串,字符串转成值 原文:json字符串转换成json对象,json对象转换成字符串,值转换成字符串,字符串转成值 主要内容: 一 ...
- testInt转换成字符串
testInt转换成字符串 var i:int = 10; trace(i.toString()); trace(i.toString().length); ...
最新文章
- PAT(甲级)2018年冬季考试 7-4 Heap Paths(非递归与递归解法)
- 设计模式之简单工厂模式(静态工厂方法)
- 2.羽翼sqlmap学习笔记之MySQL注入
- LNMP架构环境搭建之PHP、Nginx源码编译安装及其简单配置应用
- php连接oracle
- python的xlrd怎么安装_python接口测试,第三方包xlrd和xlutils,怎么安装
- linux ipconfig和route 命令
- 排序学习之---插入排序
- 三星Galaxy A70s现身GeekBench数据库:搭载6400万像素传感器
- Windows10安装VMware(图文教程)
- Android 7.1 App Shortcuts使用
- Vocaloid简介
- 房地产数字化营销方案-蓝图
- 微信小程序二手汽车拍卖系统丨可以android studio运行
- jsp学生体育成绩管理系统
- c语言上期中考试试卷答案,2007~2008学年度上学期C语言程序设计期中试卷及答案...
- 临床试验中edc录入_基于EDC的临床试验数据质量控制
- 蓝桥杯第八届真题 :拉马车
- ap计算机知识点总结,AP微积分重要知识点总结(全)
- 电子时钟万年历+51单片机+1602液晶屏+DS1302+DS18B20+按键