【C语言小技巧】16进制字符串与字符串互转

2024-02-27 1322阅读

温馨提示:这篇文章已超过451天没有更新,请注意相关的内容是否还可用!

平时我们在写功能需求时,难免不会遇到需要将16进制字符串转换成字符串,或者字符串转16进制字符串的需求,所以就有了这篇文章。

【C语言小技巧】16进制字符串与字符串互转
(图片来源网络,侵删)

在进入主题之前,我们先来回顾一下字符和16进制的关系。我们知道正常的16进制数值(像0x32)和ASIIC码(0x32对应字符2)之间是互通的,即如果你输出数值,就是输出的字符的数值(例如,字符0,十进制就是48),如果你输出字符,那就是输出的字符,不会进行转换(例如,字符0,输出就是字符0),具体可以看下面示例:

char ch = '0';
int i = 48;
printf("int: %d", ch); // 输出: int: 48
printf("char: %c", ch); // 输出: char: 0
printf("int: %d", i); // 输出: int: 48
printf("char: %c", i); // 输出: char: 0

16进制字符串转字符串

言归正传,现在我们先来看看16进制字符串转字符串,大致的逻辑就是将16进制字符串每两个字符组合在一起得到一个16进制的字符串,然后再打包转成对应的字符。我们可以利用库函数strtol(),其函数声明为long int strtol(const char *str, char **endptr, int base),该函数的功能是把参数 str 所指向的字符串根据给定的 base 转换为一个长整数(类型为 long int 型),base 必须介于 2 和 36(包含)之间,或者是特殊值 0。

  1. 参数:
    • str – 要转换为长整数的字符串
    • endptr – 对类型为char*的对象的引用,其值由函数设置为str中数值后的下一个字符
    • base – 基数,必须介于2和36(包含)之间,或者特殊值0。如果base为0,则会根据字符串的前缀来判断进制
    • 返回值:

      函数返回被转换的长整型整数值。如果输入字符串不符合数字格式,strtol() 将返回 0。如果转换结果超出了 long 整数的表示范围,那么将产生溢出,并设置 errno 为 ERANGE。你可以使用 头文件中的 errno 变量来检查是否有溢出发生。

现在我们来进行实战操作,如下示例:

#include  // 要使用strtol()库函数,需要包含头文件
char data[] = "48656C6C6F20576F726C6421210D0A"; // 假如,我们接收到这样的数据
char res[32]; // 储存转换后的结果
int hex_str_2_str(char *dest, char *src)
{
    int len = strlen(src); // 获取接收数据长度
    int i,j;
    for (i = 0, j = 0; i  

字符串转16进制字符串

前面介绍了16进制字符串转字符串,那现在我们来试试如何反过来转换。具体操作是依次将每个字符拿到并转换成对应的16进制,然后再以字符串的形式储存在容器中即可。

在这里我们需要用到库函数sprintf(),其函数声明为int sprintf(char *str, const char *format, ...),该函数是把格式化输出内容发送到所指向的字符串str中。

  1. 参数:

    • str – 指向一个字符数组的指针,该数组存储了C字符串
    • format – 这是字符串,包含了要被写入到字符串str的文本。它可以包含嵌入的format标签,format标签可被随后的附加参数中指定的值替换,并按需求进行格式化
    • 返回值:

      如果成功,则返回写入的字符总数,不包括字符串追加在字符串末尾的空字符。如果失败,则返回一个负数。

具体操作如下示例:

#include "stdio.h" // sprintf()函数声明所在的头文件
char data[] = "Hello World!!\r\n";
char res[32];
int str_2_hex_str(char *dest, char *src)
{
    int len = strlen(src); // 获取接收数据长度
    int i,j;
    for (i = 0, j = 0; i  

总结

要想实现16进制字符串和字符串之间的相互转换,只要用好strtol()和sprintf()这两个库函数,就可以轻松解决

参考

https://www.runoob.com/cprogramming/c-function-strtol.html

https://www.runoob.com/cprogramming/c-function-sprintf.html

关注公众号《嵌入式从入门到放弃》了解更多知识

VPS购买请点击我

免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!

目录[+]