16进制与ASCII互相转换

代码示例

/*---------如何将16进制数转换为字符串?---------
-----------如何将字符串转换为数据?------------*/
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <string.h>

#define SIZE 7

char *c1 = "ABCD123400001111";				//待测试字符串 高位在前
uint16_t array[SIZE] = {0xABC,0x123,0xFFF,4095,100,8,6};		//待测试16进制数组

int main(void) {
	int i, len;
	uint32_t temp[30] = { 0 };
	char temp1[50] = { 0 };

	/*函数声明*/
	void HexToAscii(uint8_t *src, char *dest, int len);	  //16进制数转换为字符串
	char lowtocap(char c);							      //小写字母转大写字母
	void AsciiToHex(char *src, uint32_t *dest, int len);   //字符串转16进制数

  /**
	* @brief  字符串长度判断处理
	* @note   字符串两个一组,不足两个当一组处理
	*/
	AsciiToHex(c1, temp, strlen(c1));   //字符串 c1 转16进制数
	if (strlen(c1) % 4 > 0)				  //字符串长度为奇数,进1
	{
		len = strlen(c1) / 4 + 1;
	}
	else								  //字符串长度为偶数					
	{
		len = strlen(c1) / 4;
	}
	for (i = 0; i < len; i++)
	{
		printf(" AsciiToHex int[%d] is %X,%d \n", i + 1, temp[i], temp[i]);  //%x十六进制 %d十进制
	}

	HexToAscii(array, temp1, SIZE); //16进制数组 s 转换为字符串
	printf("\n HexToAscii temp1 is %s \n\n", temp1);

	return 0;
}

/**
  * @brief  Hex transform to ascii string
  * @note   16进制数转换为字符串
  * @param  *src  : 字符串指针
  * @param  *dest : 数组指针
  * @param  len   : 字符串长度  strlen(c1)不包括结束字符(即 null 字符)
  * @retval void
  */
void HexToAscii(uint16_t *src, char *dest, int len)
{
	char dh1, dl2, dl3;  //字符串的高位和低位
	int i;
	if (src == NULL || dest == NULL)
	{
		printf("src or dest is NULL\n");
		return;
	}
	if (len < 1)
	{
		printf("length is NULL\n");
		return;
	}
	for (i = 0; i < len; i++)
	{
		//printf("i = %d , %x\n",i, src[i]);
		dh1 = '0' + src[i] / 256;
		dl2 = '0' + src[i] % 256 / 16;		//以0为基准 dh='0'+AB/16=48+10=58 
		dl3 = '0' + src[i] % 16;		//dl='0'+AB%16=48+11=59

		if (dh1 > '9')
		{
			dh1 = dh1 - '9' - 1 + 'A'; // 或者 dh1= dh1+ 7;  dh1=65(A)
		}
		if (dl2 > '9')
		{
			dl2 = dl2 - '9' - 1 + 'A'; // 或者 dl2= dl2 + 7;  dl2=66(B)
		}
		if (dl3 > '9')
		{
			dl3 = dl3 - '9' - 1 + 'A'; // 或者dl3 = dl3 + 7; dl3=67(C)
		}
		dest[3 * i] = dh1;
		dest[3 * i + 1] = dl2;
		dest[3 * i + 2] = dl3;
	}
	dest[3 * i] = '\0';   //字符串结尾
}

/**
  * @brief  ascii string transform to 16 jinzhi Hex.
  * @note   字符串转16进制数
  * @param  *src  : 字符串指针
  * @param  *dest : 数组指针
  * @param  len   : 字符串长度  strlen(c1)不包括结束字符(即 null 字符)
  * @retval void
  */
void AsciiToHex(char *src, uint32_t *dest, int len)
{
	int  dh1 , dh2 , dl1 , dl2;							// 16进制的高4位和低4位
	char ch1 , ch2 , cl1 , cl2;							//字符串的高位和低位
	int i;
	if (src == NULL || dest == NULL)
	{
		printf("src or dest is NULL\n");
		return;
	}
	if (len < 1)
	{
		printf("length is NULL\n");
		return;
	}
	for (i = 0; i < len; i++)
	{
		ch1 = src[4 * i];					//字符串高位
		ch2 = src[4 * i + 1];				//字符串高位
		cl1 = src[4 * i + 2];				//字符串低位
		cl2 = src[4 * i + 3];				//字符串低位
		dh1 = lowtocap(ch1) - '0';			//dh1 = 'A'- '0' = 17 (ASCII)  16进制高四位  
		if (dh1 > 9)
		{
			/*lowtocap可以用库函数toupper*/
			dh1 = lowtocap(ch1) - 'A' + 10;   //dh1 = 'A'- 'A' + 10 = 10 (ASCII)
		}
		dh2 = lowtocap(ch2) - '0';
		if (dh2 > 9)						  //dh2 = 'B'- '0' = 18 (ASCII)
		{
			dh2 = lowtocap(ch2) - 'A' + 10;   //dh2 = 'B'- 'A' + 10 = 11 (ASCII)
		}
		dl1 = lowtocap(cl1) - '0';			  //dl1 = 'C'- '0' = 19 (ASCII)
		if (dl1 > 9)
		{
			dl1 = lowtocap(cl1) - 'A' + 10;   //dl = 'C'- 'A' + 10 = 12 (ASCII)
		}
		dl2 = lowtocap(cl2) - '0';			  //dl = 'D'- '0' = 20 (ASCII)
		if (dl2 > 9)
		{
			dl2 = lowtocap(cl2) - 'A' + 10;   //dl = 'D'- 'A' + 10 = 13  (ASCII)
		}

		dest[i] = dh1 * 4096 + dh2 * 256 + dl1 * 16 + dl2;	//数组赋值 dest[0] = 10*4096 + 11*256 + 12*16 + 13 = 43981

	}
	if (len % 4 > 0)						//字符串个数为奇数 len = 11
	{
		dest[len / 4] = src[len - 1] - '0';  //落单字符单独成组  数组从0开始计数
		if (dest[len / 4] > 9)				// >9 使用字母表示,以A为基准 <9 直接数字表示
		{
			dest[len / 4] = lowtocap(src[len - 1]) - 'A' + 10;
		}
	}
}

/**
  * @brief  lowercase letters transform to capital letter
  * @note   小写字母转大写字母
  * @param  c  : 入口参数 char字符
  * @retval char
  */
char lowtocap(char c)
{
	if ((c >= 'a') && (c <= 'z'))
	{
		c = c - 32;       // 或者c = c + ('a' - 'A');
	}
	return c;
}

运行结果

在这里插入图片描述
参考链接:
16进制与字符串相互转换(C语言)

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值