十六进制元素数组与字符串相互转换(C语言)

0x00 前言

文章中的文字可能存在语法错误以及标点错误,请谅解;

如果在文章中发现代码错误或其它问题请告知,感谢!

0x01 字符串化成十六进制数组

将十六进制的数组转化成同样值的字符串函数如下:

int StringToBuff(char *str,unsigned char *OutputBuff)
{
	char *p = NULL;
	char High = 0;
	char Low = 0;
	int i = 0;
	int Len = 0;
	int count = 0;
	
	p = str;
	Len = strlen(p);

	while(count < (Len/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;
        OutputBuff[count] = ((High & 0x0f) << 4 | (Low & 0x0f));
        p ++;
        count ++;
    }
	//判断字符串长度是否为奇数
	if(0 != Len%2)
	{
		OutputBuff[count++] = ((*p >'9')&&(*p<='F')||(*p<='f'))?*p-48-7:*p-48;
	}
	
	return Len/2 + Len%2;
}

0x02 十六进制数组转化成字符串

int ArrayToStr(unsigned char *Buff, unsigned int BuffLen, char *OutputStr)
{
	int i = 0;
	char TempBuff[128] = {0};
	char strBuff[256] = {0};
	
	for(i = 0; i<BuffLen;i++)
	{
		sprintf(TempBuff,"%02x",Buff[i]);//以十六进制格式输出到TempBuff,宽度为2
		strncat(strBuff,TempBuff,BuffLen*2);//将TempBuff追加到strBuff结尾
	}
	strncpy(OutputStr, strBuff, BuffLen*2); //将strBuff复制到OutputStr
	return BuffLen*2;
}

0x03 举例

#include "stdio.h"
#include "stdlib.h"
#include "string.h"
unsigned char ArrayHex[16] = {0x1a, 0x2b, 0x3c, 0x4d, 0x5e, 0x6f, 0x7b, 0x8d, 0x9e, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16};

char *strCom = "1a2b3c4d5e6f7a8b9c1011121314";
 
int main(int argc, const char *argv)
{
    int i= 0;
    int outlen = 0;
    char str[33] = {0};
    unsigned char out[33] = {0};
    
    ArrayToStr(ArrayHex, 16, str);   
    printf("after ArrayToStr :%s\n",str);
    
    outlen = StringToBuff(strCom, out);
    printf("after StringToBuff\n");
    for(i= 0; i< outlen; i++)
    {
        printf("%02X ", out[i]);
    } 
	printf("\n");

    return 0;
}

以上。

参考文档:
https://blog.csdn.net/zhemingbuhao/article/details/83111564

  • 9
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
可以使用C语言的标准库函数`sscanf()`和`strlen()`来实现将十六进制字符串转换十六进制数组。具体的实现代码如下: ```c #include <stdio.h> #include <string.h> #define MAX_LEN 256 int main() { char hex_string[MAX_LEN]; unsigned char hex_array[MAX_LEN / 2]; int i, len; printf("请输入十六进制字符串:"); scanf("%s", hex_string); len = strlen(hex_string); if (len % 2 != 0) { // 检查字符串长度是否为偶数 printf("错误:输入的字符串长度必须为偶数!\n"); return 1; } for (i = 0; i < len; i += 2) { sscanf(hex_string + i, "%2hhx", &hex_array[i / 2]); } printf("转换后的十六进制数组为:\n"); for (i = 0; i < len / 2; i++) { printf("%02X ", hex_array[i]); } printf("\n"); return 0; } ``` 在上面的代码中,首先通过`scanf()`函数从控制台读取输入的十六进制字符串,然后通过`strlen()`函数获取字符串的长度。接着检查字符串长度是否为偶数,因为每两个字符代表一个十六进制数,所以字符串长度必须为偶数。如果字符串长度不是偶数,则输出错误信息并退出程序。 接下来使用`sscanf()`函数将字符串中的每两个字符转换为一个十六进制数,并存储到数组中。最后使用循环遍历数组,输出转换后的十六进制数组。 注意,在使用`sscanf()`函数转换字符串时需要使用`hh`长度修饰符来指定转换结果的类型为`unsigned char`,否则在某些平台上可能会出现类型转换错误。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值