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

    文章

    18604

    浏览量

    386856
  • 代码
    +关注

    关注

    30

    文章

    4941

    浏览量

    73136
  • 16进制
    +关注

    关注

    1

    文章

    13

    浏览量

    9062

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

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

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

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    对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 1434次阅读
    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 883次阅读
    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

    0.7-4.0 GHz 五位数字衰减器,带并行驱动器 (0.5 dB LSB) skyworksinc

    电子发烧友网为你提供()0.7-4.0 GHz 五位数字衰减器,带并行驱动器 (0.5 dB LSB)相关产品参数、数据手册,更有0.7-4.0 GHz 五位数字衰减器,带并行
    发表于 05-23 18:31
    0.7-4.0 GHz 五位数字衰减器,带<b class='flag-5'>串</b><b class='flag-5'>转</b>并行驱动器 (0.5 dB LSB) skyworksinc

    用TXT编辑器打开十六进制文件,如何知道校验和值?

    我从客户那边得到了一个 pmg1-s3 十六进制文件,我想把它和校验和提供给集成电路编程工厂。 1.用 TXT 编辑器打开十六进制文件,如何知道校验和值? 附带的是十六进制文件。 2. 另一个问题是
    发表于 05-23 07:49

    itop-3568开发板驱动开发指南-实验程序的编写

    数组 6、static char str1[10];//定义 char 类型字符 str1 7、static int n_para;//定义 int 类型的用来记录
    发表于 05-19 10:26

    HEX2BIX Fx2lp图像太大怎么解决?

    maya2000pro.iic maya2000pro.hex” 如果我的代码大小大于 16Kb,则会出现错误“错误:输入图像对于输出文件大小来说太大。Addr = 0x341a,len = 0xc
    发表于 04-30 06:37

    请问如何烧录多个十六进制文件?

    当我使用 S32DS 程序加载时,所有十六进制文件都是通过使用这些命令执行一次擦除来加载的,但是当我通过使用 CMD 打开服务器和客户端来加载时,所有十六进制文件中的所有内容都会被擦除命令擦除
    发表于 03-27 06:59

    ASCII十六进制

    UDP通讯输出数据是ASCII,用强制类型转换会丢数值,48字节不全,请问有没有大佬有好的方法把ASCII转成16进制数啊?
    发表于 02-18 11:42

    字符在数据库中的存储方式

    数据库是现代信息技术中存储和管理数据的核心组件。字符作为最常见的数据类型之一,在数据库中的存储方式对其性能和可扩展性有着重要影响。 数据类型 固定长度字符 :如CHAR类型,它为每个字符
    的头像 发表于 01-07 15:41 1250次阅读

    字符与字符数组的区别

    在编程语言中,字符和字符数组是两种基本的数据结构,它们都用于存储和处理文本数据。尽管它们在功能上有一定的重叠,但在内部表示、操作方式和使用场景上存在显著差异。 1. 内部表示 字符 字符
    的头像 发表于 01-07 15:29 1676次阅读

    LM98640到底按照什么时序采集才能正确实现并?

    自制FPGA数据采集板,通过txtfrm和txtclk采集输出LVDS数据,怎么有错,因为输出时钟是个假320MHz(INCLK=40MHz),每个点只有7个时钟,差一个,到底按照什么时序采集才能正确实现并?
    发表于 12-25 07:38

    bcd与十进制之间的关系

    4位二进制数来表示1位十进制数中的0~9这10个数码,是一种二进制的数字编码形式。 表示方法 :在BCD码中,每一位十进制数都被编码为4位二进制
    的头像 发表于 12-20 17:15 3870次阅读

    数组的下标为什么可以是负数

    最近有同学发来这样一段代码,并提出一个问题,数组的下标为什么可以是负数?     #include int main(){ const char *s = "helloworld"; const
    的头像 发表于 12-20 11:18 856次阅读