C语言的字符串操作并不像java,Csharp那样提供直接的方法,简单粗暴。所以,在转换的时候往往费力费时,近日做项目正好用到和java程序通讯,java发送过来的数据是十六进制数字组成的字符串,解析的时候颇费心思才算完成,所以,权在此做一笔记,方便以后查看,以及需要帮助的童鞋,当然,有问题欢迎随时交流,一同进步,欧耶!~

一、将数组转换为十六进制同值的字符串

读取数组中的数字,打印成字符串的时候以2位大写的格式。

int arrayToStr(unsigned char *buf, unsigned int buflen, char *out)
{char strBuf[33] = {0};char pbuf[32];int i;for(i = 0; i < buflen; i++){sprintf(pbuf, "%02X", buf[i]);strncat(strBuf, pbuf, 2);}strncpy(out, strBuf, buflen * 2);printf("out = %s\n", out);return buflen * 2;
}

二、将十六进制的字符串转换为十六进制数组

第一种方式:下面定义的字符串中的字符只能是0-F的字符,但是不区分大小写的,前面是安装两位为一个数字进行转换,最后一个数字如果还是两位的则正常转换,如果只剩一位的话则在前面补零输出。

int StringToHex(char *str, unsigned char *out, unsigned int *outlen)
{char *p = str;char high = 0, low = 0;int tmplen = strlen(p), cnt = 0;tmplen = strlen(p);while(cnt < (tmplen / 2)){high = ((*p > '9') && ((*p <= 'F') || (*p <= 'f'))) ? *p - 48 - 7 : *p - 48;low = (*(++ p) > '9' && ((*p <= 'F') || (*p <= 'f'))) ? *(p) - 48 - 7 : *(p) - 48;out[cnt] = ((high & 0x0f) << 4 | (low & 0x0f));p ++;cnt ++;}if(tmplen % 2 != 0) out[cnt] = ((*p > '9') && ((*p <= 'F') || (*p <= 'f'))) ? *p - 48 - 7 : *p - 48;if(outlen != NULL) *outlen = tmplen / 2 + tmplen % 2;return tmplen / 2 + tmplen % 2;
}

第二种方式:与第一种方式相同,只不过使用库函数实现,实现代码如下:

int StringHextoHex(char *str, unsigned char *out, int *outlen)
{if (str == NULL || out == NULL)return -1;int i = 0, ret = 0;ret = (strlen(str) / (2 * sizeof(char))) + strlen(str) % (2 * sizeof(char));for (i = 0; i < ret; i++)sscanf(str + 2 * i, "%02X", (unsigned int *)(out + i));if (outlen!= NULL)*outlen = ret;return ret;
}

三、将十进制字符串转化为十进制数组

int StringToCom(char *str, unsigned char *out, int *outlen)
{char *p = str;char high = 0, low = 0;int tmplen = strlen(p), cnt = 0;tmplen = strlen(p);if(tmplen % 2 != 0) return -1;while(cnt < tmplen / 2) //1213141516171819{out[cnt] = (*p - 0x30) * 10 + (*(++p) - 0x30);p++;cnt ++;}*outlen = tmplen / 2;return tmplen / 2;
}

四、简单的使用方法

定义的参数有些为unsigned char,是因为在定义为char的时候,转换为十六进制之后,负数在表示的时候,难看!

#include "stdio.h"
#include "stdlib.h"
#include "string.h"unsigned char ArrayCom[16] = {11, 12, 13, 14, 15, 16, 17, 18,19, 20, 21, 22, 23, 24, 25, 26};
unsigned char ArrayHex[16] = {0x2c, 0x57, 0x8f, 0x79, 0x27, 0xa9, 0x49, 0xd3,0xb5, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};char *strHex = "01aa0304050607083f0add0c0d0e0f00";
char *strCom = "1D1213AB6FC1718B19202122232425A6";int main(int argc, const char *argv)
{char str[33] = {0};unsigned char out[33];arrayToStr(ArrayCom, 16, str);int outlen = 0;StringToHex(strCom, out, &outlen);for(int cnt = 0; cnt < outlen; cnt ++)printf("%02X ", out[cnt]);putchar(10);outlen = 0;StringHextoHex(strHex, out, &outlen);for (int i = 0; i < outlen; i++)printf("%02X ", out[i]);putchar(10);return 0;
}

C语言 -- 字符串和十六进制的相互转换方式相关推荐

  1. 16进制转10进制 nodejs_Js字符串与十六进制的相互转换 【转】

    开发过程中,字符串与十六进.二进制之间的相互转换常常会用到,尤其是涉及到中文的加密时,就需要把中文转换为十六进制.下面说说具体的转换方法. 1.字符串转换为十六进制 主要使用 charCodeAt() ...

  2. C语言--字符串和数字的相互转换

    1.数字转换为字符串 sprintf 跟printf 在用法上几乎一样,只是打印的目的地不同而已,前者打印到字符串中,后者则直接在命令行上输出. sprintf 是个变参函数,定义如下:  int s ...

  3. Go语言字符串和数组的相互转换

    字符串转数组 package mainimport "fmt"func main() {s := "lichuachua"lcc1 := []rune(s)lc ...

  4. C语言 字符串与整数的相互转换(atoi/atol/sprintf函数简解)

    字符串转化为整数 atoi函数与atol函数 atol函数是将字符串转化为整形,atol函数是将字符串转化为长整型 注意:其实他们没什么区别. int main() {printf("siz ...

  5. C语言 文本字符串和十六进制形式的相互转换

                                                      C语言 文本字符串和十六进制形式的相互转换 一.简述        记--C语言实现 文本形式的字符 ...

  6. c语言字母转换数字代码,实现c语言中字符串和数字的相互转换的代码

    实现c语言中字符串和数字的相互转换的代码 引导语:代码就是程序员用开发工具所支持的语言写出来的源文件,是一组由字符.符号或信号码元以离散形式表示信息的明确的'规则体系.以下是百分网小编分享给大家的实现 ...

  7. C语言中存储多个字符串的两种方式

    C语言中存储多个字符串的两种方式 方式一 二维字符串数组 声明: char name[4][10] = { "Justinian", "Momo", " ...

  8. 【String拼接】Go语言字符串如何高效的进行拼接(6种方式进行对比分析)

    string类型 我们首先来了解一下Go语言中string类型的结构定义,先来看一下官方定义: // string is the set of all strings of 8-bit bytes, ...

  9. Go语言字符串拼接的三种方式

    Go语言字符串拼接的三种方式 使用bytes.Buffer实现字符串拼接 通过创建一个缓冲byte类型的缓冲器str1,然后通过WriteString方法将传入的字符串放入缓冲器的尾部,已达到拼接的作 ...

最新文章

  1. PHP 设计模式 笔记与总结(9)数据对象映射模式
  2. 实验室信息管理系统(LIMS)知识大全
  3. python画椭圆-python opencv圆、椭圆与任意多边形的绘制实例详解
  4. shiro之第一个程序认证
  5. hikari如何切换数据源_hikari数据库连接池
  6. nil,Nil,NULL,NSNull
  7. 基于JAVA+SpringMVC+Mybatis+MYSQL的公司管理系统
  8. 取代 JavaScript!Python 成 Stack Overflow 最受质疑编程语言
  9. [HZAU]华中农业大学第四届程序设计大赛网络同步赛
  10. 基于matlab仿真的功率因数测定方法研究,基于MATLAB的单相全控整流电路功率因数测定.pdf...
  11. 卸载神器:geek(绝对好用,中国人不骗中国人)
  12. MongodB数据库安装教程
  13. 小米网站短信验证码接口的轰炸防护
  14. [渝粤教育] 中国地质大学 建筑艺术赏析 复习题
  15. 晚安西南-----地破实验
  16. 软件测试面试题:什么是Ramp up?你如何设置?
  17. 性能优化 ---启动优化
  18. 构建SaaS化平台产品的建议
  19. Docker容器获取局域网ip(使用macvlan)
  20. 现代交通灯的设计C语言编程,交通灯设计_优秀论文.doc

热门文章

  1. 016-类与对象-OC笔记
  2. 2022年NOC软件创意编程(学而思赛道)决赛小学高年级组python
  3. elementUi——table组件修改表头和表身行样式——style的使用
  4. 概览的样式css,app页面概览.html
  5. CSDN产品公告第1期:APP新增大厂在线刷题功能、博主排名规则更新、MD编辑器优化
  6. js 常用设计模式(1024过节礼物)
  7. 面试必问:Spring循环依赖
  8. iReport 报表元素大全
  9. sed -i 单引号中嵌套双引号_【linux】Shell 单引号#x27;#x27; 双引号quot;quot; 反引号`` 和$()的区别和用法...
  10. Nacos Github