0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

char数组转16进制HEX串

GReq_mcu168 来源:玩转单片机 2020-08-04 16:53 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

缘由


这个起因是昨晚群里有人在讨论怎么把字符串转成HEX方法最佳,讨论到最后变成哪种方法效率最优了。毕竟这代码是要在MCU上面跑的,要同时考虑到时间和空间的最优解。
当然讨论的是有结果的,具体实现的方法和代码在下面展示。

char数组转16进制HEX串


例子:
将如下的量

char str[] = "12345";char data[] = {1,2,3,4,5,0xff}; 转成

"313233343500""0102030405FF" 这样的结果
这个其实很简单,追求速度的话,查表就好了
从0-16对应0-F即可:

constcharhex_table[]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'}; 然后一个个从表里取出来,拼到对应位置即可:

void to_hex(char *s, int l, char *d){ while(l--) { *(d+2*l+1) = hex_table[(*(s+l))&0x0f]; *(d+2*l) = hex_table[(*(s+l))>>4]; }} 完整测试代码如下:

#include const char hex_table[] = {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};void to_hex(char *s, int l, char *d){ while(l--) { *(d+2*l+1) = hex_table[(*(s+l))&0x0f]; *(d+2*l) = hex_table[(*(s+l))>>4]; }}int main () { char s[]= "1234"; char d[9]; d[8] = ''; to_hex(s,4,d); printf("%s",d); return 0;} 输出结果:31323334

16进制HEX串转成数值数组


例子:
将类似"AAbb2fFF"的量转成{0xAA,0xBB,0x2F,0xff}这样的结果
这里如果还用查表的话,这个rom占用会浪费掉不少空间,所有查表法直接就被否决掉了(如果是PC上,追求极致速度的话,当然可以用)。
同时,为了通用性,代码需要兼容大小写两种输入数据
在仔细研究数据的结构时,我发现了个规律:
ASCII中的0-9对应了0x30-0x39
ASCII中的A-F对应了0x41-0x46
ASCII中的a-f对应了0x61-0x66
也就是说,只要这一个字符大于0x39,那它一定是字母;同时,在上面的分析也可以发现,如果这个字符是字母,不论大写小写,只需要看低四位就可以直接判断这个字符代表的数是多少
具体逻辑如下:
判断这个字符是否大于0x39
如果不是,直接取这个字符的低四位当作结果
如果是,则为字母,将他的低四位加上9即为所需结果
具体实现代码也如下:

void from_hex(char *s, int l, char *d){ while(l--) { char* p = s+l; char* p2 = p-1; *(d+l/2) = ( (*p>'9'? *p+9 : *p) & 0x0f ) | ( (*p2>'9'? *p2+9 : *p2) << 4 ); l--; }}  完整的测试代码

#include void from_hex(char *s, int l, char *d){ while(l--) { char* p = s+l; char* p2 = p-1; *(d+l/2) = ( (*p>'9'? *p+9 : *p) & 0x0f ) | ( (*p2>'9'? *p2+9 : *p2) << 4 ); l--; }}int main () { char s[]= "6F6B6f6b"; char d[5]; d[4] = ''; from_hex(s,8,d); printf("%s",d); return 0;}  输出结果:okok

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • mcu
    mcu
    +关注

    关注

    147

    文章

    19235

    浏览量

    405191
  • 代码
    +关注

    关注

    30

    文章

    4983

    浏览量

    74543
  • 16进制
    +关注

    关注

    1

    文章

    13

    浏览量

    9146

原文标题:太巧妙了!适合 MCU 用的 C语言 快速互转 HEX (16进制) 方法!

文章出处:【微信号:mcu168,微信公众号:硬件攻城狮】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    AD7849:14/16行输入乘法数模转换器的设计与应用

    AD7849:14/16行输入乘法数模转换器的设计与应用 在电子工程领域,数模转换器(DAC)是连接数字世界和模拟世界的关键桥梁。AD7849作为一款功能强大的14/16行输入
    的头像 发表于 04-14 16:20 205次阅读

    解析AD5541A:16行输入DAC的卓越性能与应用

    解析AD5541A:16行输入DAC的卓越性能与应用 在电子设计领域,数模转换器(DAC)是连接数字世界与模拟世界的关键桥梁。今天我们要详细探讨的是Analog Devices公司
    的头像 发表于 04-10 17:45 1144次阅读

    嵌入式春招笔试高频算法题(附解题思路)

    的应届生、新手打造,整理了5道嵌入式春招笔试高频算法题,覆盖数组、链表、字符进制转换等核心考点,每道题都附上“题干+解题思路+C语言代码实现”,贴合嵌入式笔试场景,可直接复制练习,帮你高效备战、快速提分
    发表于 03-18 10:08

    深入解析SGM5353 - 1616行输入电压输出DAC

    深入解析SGM5353 - 1616行输入电压输出DAC 在电子设计领域,数模转换器(DAC)是连接数字世界和模拟世界的重要桥梁。今天,我们就来深入了解一下SGMICRO推出的SGM5353
    的头像 发表于 03-12 09:45 328次阅读

    ARDUINO串口收发16进制

    大家好,本人菜鸟刚学,请大家给与帮助。我用串口助手向我的设备发送16进制码读取温度湿度值,发送命令55 1B 02 00 02 0E 08 E8 55 1B 02 00 02 0E 08 E8,接收
    发表于 01-18 17:27

    C语言常用的转换函数实现原理

    编程时,经常用到进制转换、字符转换。比如软件界面输入的数字字符,如何将字符处理成数字呢?今天就和大家分享一下。 字符十六
    发表于 01-06 08:30

    分享几个实用的嵌入式 C程序!

    和精力。 所以想在这里统一记录一下,以备下次重新使用。代码以实用为主,如果缺陷,欢迎指出。 1、十六进制字符整型数字 功能:将16进制的字符
    发表于 01-04 08:37

    深入剖析DS92LV1616位总线LVDS串行器/解器的卓越性能与应用

    深入剖析DS92LV1616位总线LVDS串行器/解器的卓越性能与应用 在当今高速数据传输的时代,串行器/解器(SERDES)在数据处理和传输中扮演着至关重要的角色。德州仪器(T
    的头像 发表于 12-31 14:45 629次阅读

    matlab2024a启动自运行文档无效

    打算命令行启动自动配置为16进制模式,于是startup.m文件中,添加format hex。重启后,发现命令行还是10进制模式。
    发表于 12-30 10:03

    字符关联数字变量如何使用?我们的地址都是16位数据,可以使用16位数字变量显示字符吗?

    字符关联数字变量如何使用?我们的地址都是16位数据,可以使用16位数字变量显示字符吗?
    发表于 12-15 08:24

    进制查找(Binary Search)介绍

    进制查找(Binary Search)用于在已排序的数组中执行二进制查找的函数。 int binary_search(int arr[], int size, int target
    发表于 12-12 06:54

    对UART0输入到串口的char型数据转换成16进制的寄存器常用int型相关处理

    ascii码了,比如输入0,但接收到转换成int型后显示的却是48,输入a显示的是97。 为了方便硬件寄存器得到想要的16进制数据,我们先要将char型转换成int型。 利用如图所示代码,即可
    发表于 10-31 07:58

    3-16一颗芯片搞定 全解AMG8816全集成BMS主控的参数真相

    3-16一颗芯片搞定”——全解AMG8816全集成BMS主控的参数真相 在 电动两轮车、园林工具和储能小型Pack 日趋精简化的今天,一颗“能干事”的电池管理芯片(BMS主控)正成为系统设计的关键
    的头像 发表于 07-30 16:38 2502次阅读
    3-<b class='flag-5'>16</b><b class='flag-5'>串</b>一颗芯片搞定 全解AMG8816全集成BMS主控的参数真相

    Analog Devices / Maxim Integrated MAX96717 CSI-2GMSL™2行器数据手册

    Analog Devices MAX96717 CSI-2GMSL™2行器接受4路MIPI CSI-2接口上的视频,然后在GMSL2行链路收发器上输出,通过同轴电缆传输。同时,该器件通过同一
    的头像 发表于 06-17 14:02 1491次阅读
    Analog Devices / Maxim Integrated MAX96717 CSI-2<b class='flag-5'>转</b>GMSL™2<b class='flag-5'>串</b>行器数据手册

    300 kHz 至 2.0 GHz 5 位数字衰减器,带并行驱动器 skyworksinc

    电子发烧友网为你提供()300 kHz 至 2.0 GHz 5 位数字衰减器,带并行驱动器相关产品参数、数据手册,更有300 kHz 至 2.0 GHz 5 位数字衰减器,带
    发表于 05-26 18:30
    300 kHz 至 2.0 GHz 5 位数字衰减器,带<b class='flag-5'>串</b><b class='flag-5'>转</b>并行驱动器 skyworksinc