今天就跟大家聊聊有关如何实现linux下ASCII转HEX,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。
在项目开发过程有时需要对一串数字的16进制文本转换成16进制数组,这是实现方法:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h> /*isspace,toupper的头文件*/
#include <stdint.h> /*uint8_t的头文件*/
/*去除数组中的空格*/
char *trim(char *str)
{
if(str == NULL || *str == '\0')
return NULL;
int len = strlen(str);
char *p = str;
while(*p != '\0'){
while(isspace(*p)){
memmove(p,p+1,strlen(p+1)+1);
}
p++;
}
return str;
}
/*ascii 转16进制数组,失败返回-1,成功返回0*/
int ascii2hex(const char *string,int length,uint8_t hex[],int *hexlen)
{
char src_arr[length+2];/*奇数个字符首位补‘0’,字符串结束符'\0',所以是+2*/
int src_len=0,i;
char ah,al;
uint8_t ih,il;
if(string == NULL || hex == NULL || length <1 || hexlen == NULL){
return -1;
}
memset(src_arr,0x00,sizeof(src_arr));
memcpy(src_arr,string,length);
if(trim(src_arr) == NULL)
return -1;
src_len = strlen(src_arr);
if(src_len%2){
*hexlen = src_len/2 + 1;
memmove(&src_arr[1],&src_arr[0],src_len);
src_arr[0] = '0';
}else{
*hexlen = src_len/2;
}
for(i = 0;i < *hexlen;i++){
ah = src_arr[2*i];
al = src_arr[2*i+1];
ih = (ah > '9') ? (toupper(ah) - 'A' + 10):(ah - '0');
il = (al > '9') ? (toupper(al) - 'A' + 10):(al - '0');
hex[i] = ih * 16 + il;
}
return 0;
}
/*16进制转ascii ,失败返回-1,成功返回0*/
int hex2ascii(uint8_t *src, char dest[], int len)
{
uint8_t dh,dl; //字符串的高位和低位
int i;
if(src == NULL || dest == NULL || len < 1){
return -1;
}
for(i = 0; i < len; i++){
dh = src[i] / 16;
dh = (dh > 9) ? (dh-10+'A'):(dh + '0');
dl = src[i] % 16;
dl = (dl > 9) ? (dl-10+'A'):(dl + '0');
dest[2*i] = dh;
dest[2*i+1] = dl;
}
dest[2*i] = '\0';
return 0;
}
看完上述内容,你们对如何实现linux下ASCII转HEX有进一步的了解吗?如果还想了解更多知识或者相关内容,请关注亿速云行业资讯频道,感谢大家的支持。
亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。
原文链接:https://my.oschina.net/lgg/blog/4554794