C语言字符串和十六进制的相互转换方式
C语言的字符串操作并不像java,Csharp那样提供直接的方法,简单粗暴。所以,在转换的时候往往费力费时,近日做项目正好用到和java程序通讯,java发送过来的数据是十六进制数字组成的字符串,解析的时候颇费心思才算完成,所以,权在此做一笔记,方便以后查看,以及需要帮助的童鞋,当然,有问题欢迎随时交流,一同进步,欧耶!~
一、将数组转换为十六进制同值的字符串
读取数组中的数字,打印成字符串的时候以2位大写的格式。
int arrayToStr(unsigned char *buf, unsigned int buflen, char *out)
{
char strBuf[] = {};
char pbuf[];
int i;
for(i = ; i < buflen; i++)
{
sprintf(pbuf, "%02X", buf[i]);
strncat(strBuf, pbuf, );
}
strncpy(out, strBuf, buflen * );
printf("out = %s\n", out);
return buflen * ;
}
二、将十六进制的字符串转换为十六进制数组
下面定义的字符串中的字符只能是0-F的字符,但是不区分大小写的,前面是安装两位为一个数字进行转换,最后一个数字如果还是两位的则正常转换,如果只剩一位的话则在前面补零输出。
int StringToHex(char *str, unsigned char *out, unsigned int *outlen)
{
char *p = str;
char high = , low = ;
int tmplen = strlen(p), cnt = ;
tmplen = strlen(p);
while(cnt < (tmplen / ))
{
high = ((*p > '') && ((*p <= 'F') || (*p <= 'f'))) ? *p - - : *p - ;
low = (*(++ p) > '' && ((*p <= 'F') || (*p <= 'f'))) ? *(p) - - : *(p) - ;
out[cnt] = ((high & 0x0f) << | (low & 0x0f));
p ++;
cnt ++;
}
if(tmplen % != ) out[cnt] = ((*p > '') && ((*p <= 'F') || (*p <= 'f'))) ? *p - - : *p - ; if(outlen != NULL) *outlen = tmplen / + tmplen % ;
return tmplen / + tmplen % ;
}
三、将十进制字符串转化为十进制数组
int StringToCom(char *str, unsigned char *out, int *outlen)
{
char *p = str;
char high = , low = ;
int tmplen = strlen(p), cnt = ;
tmplen = strlen(p);
if(tmplen % != ) return -;
while(cnt < tmplen / ) //
{
out[cnt] = (*p - 0x30) * + (*(++p) - 0x30);
p++;
cnt ++;
}
*outlen = tmplen / ;
return tmplen / ;
}
四、简单的使用方法
定义的参数有些为unsigned char,是因为在定义为char的时候,转换为十六进制之后,负数在表示的时候,难看!
#include "stdio.h"
#include "stdlib.h"
#include "string.h" unsigned char ArrayCom[] = {
, , , , , , , ,
, , , , , , , };
unsigned char ArrayHex[] = {
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)
{
int cnt;
char str[] = {};
unsigned char out[];
arrayToStr(ArrayCom, , str); int outlen = ;
StringToHex(strCom, out, &outlen);
for(cnt = ; cnt < outlen; cnt ++)
{
printf("%02X ", out[cnt]);
}
putchar(); return ;
}
C语言字符串和十六进制的相互转换方式的更多相关文章
- Js字符串与十六进制的相互转换
开发过程中,字符串与十六进.二进制之间的相互转换常常会用到,尤其是涉及到中文的加密时,就需要把中文转换为十六进制.下面说说具体的转换方法. 1.字符串转换为十六进制 主要使用 charCodeAt() ...
- Js字符串与十六进制的相互转换 【转】
开发过程中,字符串与十六进.二进制之间的相互转换常常会用到,尤其是涉及到中文的加密时,就需要把中文转换为十六进制.下面说说具体的转换方法. 1.字符串转换为十六进制 主要使用 charCodeAt() ...
- JS字符串与十六进制的相互转换(转载)
原文链接:http://www.cnblogs.com/zack-/archive/2012/04/17/website_using.html 1.字符串转换为十六进制 主要使用 charCodeAt ...
- C语言--字符串和数字的相互转换
1.数字转换为字符串 sprintf 跟printf 在用法上几乎一样,只是打印的目的地不同而已,前者打印到字符串中,后者则直接在命令行上输出. sprintf 是个变参函数,定义如下: int sp ...
- C 语言字符串连接的 3种方式
C 语言字符串连接的 3种方式 #include<stdio.h> #include<stdlib.h> #include<string.h> char *join ...
- C语言中存储多个字符串的两种方式
C语言中存储多个字符串的两种方式 方式一 二维字符串数组 声明: char name[][] = { "Justinian", "Momo", " ...
- C语言字符串操作总结大全(超详细)
本篇文章是对C语言字符串操作进行了详细的总结分析,需要的朋友参考下 1)字符串操作 strcpy(p, p1) 复制字符串 strncpy(p, p1, n) 复制指定长度字符串 strcat( ...
- C语言字符串长度(转)
C语言字符串长度的计算是编程时常用到的,也是求职时必考的一项. C语言本身不限制字符串的长度,因而程序必须扫描完整个字符串后才能确定字符串的长度. 在程序里,一般会用strlen()函数或sizeof ...
- C语言字符串操作常用库函数
C语言字符串操作常用库函数 *********************************************************************************** 函数 ...
随机推荐
- Flyway数据表迁移框架的使用
目录 1. 概述 2. Maven配置 3. SQL文件规范 4. 命令 5. 总结 1. 概述 Flyway是一个根据表结构快速生成数据表的工具,类似于Hibernate的自动生成表的特性. 官网: ...
- jenkins上gradle打包
https://blog.csdn.net/charon_chui/article/details/80510701
- css,html备忘录
1.background:url()#000 ;代表当图片不够充满容器时,用黑色填满. 2.height:inherit;继承父级元素的高度. 当子元素给了绝对定位,父元素不给相对定位,子元素也能适配 ...
- 大数据入门到精通18--sqoop 导入关系库到hdfs中和hive表中
一,选择数据库,这里使用标准mysql sakila数据库 mysql -u root -D sakila -p 二.首先尝试把表中的数据导入到hdfs文件中,这样后续就可以使用spark来dataf ...
- pandas进行条件格式化以及线性回归的预测
条件格式化 需求1: 将三次考试的成绩小于60分的值找出来,并将字体变为红色 需求2: 将每次考试的第一名找出来,将背景变为绿色 需求3: 使用背景颜色的深浅来表示数值的大小 需求4: 使用数据条的长 ...
- 【CPU微架构设计】分布式多端口(4写2读)寄存器堆设计
寄存器堆(Register File)是微处理的关键部件之一.寄存器堆往往具有多个读写端口,其中写端口往往与多个处理单元相对应.传统的方法是使用集中式寄存器堆,即一个集中式寄存器堆匹配N个处理单元.随 ...
- Android Studio 集成开发工具教学视频
简介 经过2年时间的研发,Google终于正式发布了面向Android开发者的集成开发环境Android Studio 1.2(稳定版).Android Studio是Google开发的一款面向And ...
- @ManyToMany的学习
新建了一个manyToMany的学生-课程表,学生可以选择多个课程,多个课程可以被学生选.尝试如下代码,创建了两个list,然后新建对象,加入list,然后set<list>,报错,这是因 ...
- Linux 内存占用大排查
用命令 top 查看发现内存使用很高,可用内存很少,导致有些服务无法正常启动. 这时,可以用下面的命令查看占用内存前10的进程,改变 10 的数字,可以调整前几的个数. ps -aux | sort ...
- impala操作hase、hive
impala中使用复杂类型(Hive): 如果Hive中创建的表带有复杂类型(array,struct,map),且储存格式(stored as textfile)为text或者默认,那么在im ...