OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3493|回复: 5

格式化输出之数据类型转换技巧--HEX转同值字符串

[复制链接]

46

主题

200

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1128
金钱
1128
注册时间
2016-3-25
在线时间
365 小时
发表于 2020-11-4 14:20:53 | 显示全部楼层 |阅读模式
本帖最后由 Mr.liu 于 2020-11-4 14:22 编辑

格式化输出之数据类型转换技巧--HEX转同值符串

如何将数组:
unsigned char decrypt[16]={0x49,0xf2,0x73.0x16,0xac,0x4e,0xe7,0xa9,0xb7,0x46,0x7e,0xc4,0x74,0xf0,0xf2,0x53};转化为:

32位小写,
unsigned char decrypt[32]={'4','9','f','2','7','3','1','6','a','c','4','e','e','7','a','9','b','7','4','6','7','e','c','4','7','4','f','0','f','2','5','3'}; 或者unsigned char decrypt[32]=“49f27316ac4ee7a9b7467ec474f0f253”;


32位大写,
unsigned char decrypt[32]={'4','9','F','2','7','3','1','6','A','C','4','E','E','7','A','9',B','7','4','6','7','E','C','4','7','4','F','0','F','2','5','3'}; 或者unsigned char decrypt[32]=“49F27316AC4EE7A9B7467EC474F0F253”;



大家有什么简单有效的方法?


当然,方法很应该很多,最直的想法是一个字节的拆,然后加一个值转成值对应的ASCII字符值,然后连接在一起。(我最先是这样想的)


这是会不会效率太低了,或者有没有更好的方法呢?答案是当然有,经过仔细查找C标准库函数,发现格式化输出函数其实也是可以进行数据类型转换!!!


好吧,废话不多说了,直接上代码:


//HEX转同值字符串
uint8_t HexToStr(char * Rbuffer,const char *string,uint16_t byteLeng,uint8_t Capitalize)
{
        uint16_t cnt=0;
        char pbuf[32];
        if(byteLeng>16) return 1;                //数据超长
        if(string==NULL)        return 2;                //参数错误
        
        for(cnt=0;cnt<byteLeng;cnt++)
        {
                if(Capitalize) sprintf(pbuf, "%02X", string[cnt]);        //大写输出
                else sprintf(pbuf, "%02x", string[cnt]);                //小写输出
                strncat(Rbuffer, pbuf, 2);
        }
        printf("Rbuffer:%s\r\n",Rbuffer);
        return 0;                //转换成功
}


如果大家有更好的方法,请分享一下,谢谢!





32位大写输出.png
32位小写输出.png
代写STM32各类驱动,DEMO程序
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

12

主题

3402

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
8686
金钱
8686
注册时间
2020-5-11
在线时间
4168 小时
发表于 2020-11-4 16:11:13 | 显示全部楼层
姚先起 发表于 2020-11-4 15:03
void HexToString(uint32_t Hex,char *Str,uint8_t StrLen)
{
        uint8_t Data;

没必要switch,查表更快捷.
//发送16进制字符
void SendHEX(U8 n)
{
        code U8 num[]="0123456789ABCDEF";
        uart1_sendstr("0x");
        uart1_sendbyte(num[n>>4]);
        uart1_sendbyte(num[n&0x0f]);
}
专治疑难杂症
回复 支持 2 反对 0

使用道具 举报

2

主题

459

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4512
金钱
4512
注册时间
2018-5-14
在线时间
964 小时
发表于 2020-11-4 15:03:14 | 显示全部楼层
void HexToString(uint32_t Hex,char *Str,uint8_t StrLen)
{
        uint8_t Data;
        uint8_t j=0;
        j=StrLen-1;
        for(uint8_t i=0;i<StrLen&&i<8;i++)
        {
                Data=Hex>>(4*j);
                j--;
                Data&=0x0F;
                switch(Data){
                        case 0:Str[i]='0';break;
                        case 1:Str[i]='1';break;
                        case 2:Str[i]='2';break;
                        case 3:Str[i]='3';break;
                        case 4:Str[i]='4';break;
                        case 5:Str[i]='5';break;
                        case 6:Str[i]='6';break;
                        case 7:Str[i]='7';break;
                        case 8:Str[i]='8';break;
                        case 9:Str[i]='9';break;
                        case 0xA:Str[i]='A';break;
                        case 0xB:Str[i]='B';break;
                        case 0xC:Str[i]='C';break;
                        case 0xD:Str[i]='D';break;
                        case 0xE:Str[i]='E';break;
                        case 0xF:Str[i]='F';break;
                }
        }
}
笨方法,最直接
回复 支持 反对

使用道具 举报

46

主题

200

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1128
金钱
1128
注册时间
2016-3-25
在线时间
365 小时
 楼主| 发表于 2020-11-11 10:22:46 | 显示全部楼层
LcwSwust 发表于 2020-11-4 16:11
没必要switch,查表更快捷.
//发送16进制字符
void SendHEX(U8 n)

思路不错!
代写STM32各类驱动,DEMO程序
回复 支持 反对

使用道具 举报

46

主题

200

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1128
金钱
1128
注册时间
2016-3-25
在线时间
365 小时
 楼主| 发表于 2020-11-11 10:23:13 | 显示全部楼层
姚先起 发表于 2020-11-4 15:03
void HexToString(uint32_t Hex,char *Str,uint8_t StrLen)
{
        uint8_t Data;

这也是个方法
代写STM32各类驱动,DEMO程序
回复 支持 反对

使用道具 举报

69

主题

269

帖子

0

精华

高级会员

Rank: 4

积分
977
金钱
977
注册时间
2014-7-4
在线时间
237 小时
发表于 2020-11-14 15:09:24 | 显示全部楼层
谢谢楼主分享
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-22 07:28

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表