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
    +关注

    关注

    145

    文章

    15989

    浏览量

    343340
  • 代码
    +关注

    关注

    30

    文章

    4553

    浏览量

    66665
  • 16进制
    +关注

    关注

    1

    文章

    13

    浏览量

    8706

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

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

收藏 人收藏

    评论

    相关推荐

    深入探索KUKA KRL中的数组应用

    如果 CHAR 类型数组的所有数组元素都拥有相同的字符串,则不必单独初始化每个数组元素。忽略右侧的数组下标。(对于一维
    的头像 发表于 04-18 10:37 98次阅读
    深入探索KUKA KRL中的<b class='flag-5'>数组</b>应用

    stm32f030口接收到数组如何处理?

    stm32f030口接收到八个字节数组,我想提取这个数组的第4位和第5位来进行运算后转为十进制数,但是提取数据的时候出问题了,本人刚入门小白,求大佬指点 下面是我中断的代码:
    发表于 03-29 06:11

    PSOC Creator和IAR编译生成的hex,怎么更改每行数据长度?

    PSOC4 芯片,PSOC Creator 导入IAR的工程,编译后生成的hex 每行64个字节, 怎么改成16个字节, 客户的hexbin的工具只识别
    发表于 02-02 06:38

    鸿蒙二进制数组创建

    napi_create_arraybuffer: 这个接口只能创建空的二进制数组,没办法把char的内容丢进去创建 napi_create_external_arraybuffer: 这个接口支持创建二
    的头像 发表于 01-31 15:24 836次阅读

    oracle中to_char用法

    to_char是Oracle数据库中的一个函数,用于将不同类型的数据转换为字符类型。 to_char函数的基本语法: to_char(表达式,格式模型) 首先,to_char函数中的表
    的头像 发表于 12-05 16:54 920次阅读

    什么是数组数组有什么用?数组的使用方法

    数组(Array)是有序的元素序列。
    的头像 发表于 11-08 14:58 683次阅读
    什么是<b class='flag-5'>数组</b>?<b class='flag-5'>数组</b>有什么用?<b class='flag-5'>数组</b>的使用方法

    在学51单片机,请问16进制字符是啥意思?

    就是现在学EEpROM,,数值转换成16进制字符啥意思,字符不是Char型的吗,怎么有16
    发表于 11-08 07:40

    为什么程序要变为HEX文件导入单片机而不是二进制文件?

    为什么程序要变为HEX文件导入单片机,而不是二进制文件?​
    发表于 10-23 08:12

    请问十六进制数组怎么转换成字符数组

    [i][i][i][i][i][i][i][i][i][i][i][i] 如题:十六进制数组怎么转换成字符数组? 比如: 下面这一
    发表于 10-19 07:51

    Labview 16进制转字符串源程序

    Labview 16进制转字符串源程序
    发表于 10-11 18:05 14次下载

    数组的定义 什么是数组

    数组 数组是内置类型,是一组同类型数据的集合,它是值类型,通过从0开始的下标索引访问元素值。 在初始化后长度是固定的,无法修改其长度。当作为方法的参数传入时将复制一份数组而不是引用同一指针。
    的头像 发表于 10-09 09:39 1308次阅读

    串口16进制发送问题

    =a21n57.1.0.0.1fd3523cMPKpf7 上面的是某宝买的模块。 不知道如何用发送数据。。。。 STM32口应该怎么发这样的 16进制数据,新手小白望大神指点下
    发表于 09-29 02:38

    如何计算DTC的16进制表示

    :ISO15031-6 这样不难计算得到文章开头的4个DTC的16进制表示,如下: 以上其实就是将下表的Code categories转换为Hex value的过程。
    的头像 发表于 07-26 10:53 856次阅读
    如何计算DTC的<b class='flag-5'>16</b><b class='flag-5'>进制</b>表示

    Char数组与String是如何从统一走向分离的?

    在很多编程语言中,经常用 String 类型来表示字符串,用 Char 来表示字符类型;
    发表于 05-19 09:49 108次阅读
    <b class='flag-5'>Char</b><b class='flag-5'>数组</b>与String是如何从统一走向分离的?

    如何使用String从flash复制char数组

    我知道一定有我遗漏的东西,但是以下链接中描述的代码如何使用 String 从 flash 复制 char 数组
    发表于 05-08 06:17