C--十六进制整形和字符串的相互转换

前言

十六进制整形:6B746d656d6f7869616667650007e26B
十进制字符串:“ktiemoxiaoge ‘\07’ '\226’k"
十六进制字符串“6B746d656d6f7869616667650007e26B”
有什么用呢??在网络通信中,常常要制定一定的通讯格式。比如我制定,我要发送16字节的数据,其中前缀和后缀都是一字节为6B,中间为12字节的发送者姓名,加上两字节的发送的数字。这时候,我们需要一个16字节的内存,将字符串的姓名,整形的数字打包进去。如“tiemoxiaoge”要转换成746d656d6f78696166676500,数字2018要转换成07e2。同样接收方也需要进行相反的操作。而转换为十六进制字符串常常用于调试,因为ascii字符只支持到127,而网络通信中会超过127如上面‘\07’和‘\226’就无法显示
注:这里的十六进制字符串代表每字节是十六进制整数的字符串,而十六进制整形真的就是整形了。

0x0–十六进制整形转十六进制字符串

先讲16整形除以10获得每一位,将每一位拷贝到数组中,拷贝数据到数组头。

	unsigned long long data_int = 0x64ab78676;
	long long  temp,temp_2=1,temp_3=0;
	char data_char[NUM];
	do 
	{
		temp_3++;
		printf("%d\n", data_int % 16);
		temp = data_int % 16;
		if (temp>=0xa&&temp<=0xf)
		{
			data_char[NUM - temp_2++]=temp+'a'-10;
		}
		else if(temp>=0xA&&temp<=0xF)
		{
			data_char[NUM - temp_2++] = temp + 'A' - 10;
		}
		else if (temp >= 0x1&& temp <= 9)
		{
			data_char[NUM - temp_2++] = temp + '0' ;
		}
		else
		{
			return -1;
		}
	} while (data_int = data_int / 16);

	char data_buf[NUM]{0};
	memcpy(data_buf, &data_char[NUM  - temp_3], temp_3);
	memset(data_char, 0, NUM);
	memcpy(data_char, data_buf, NUM);
	printf("%s\n", data_char);

0x1-- 十进制字符串转十六进制整形

字符串本身不用转换,只需要将字符串的内存移植过去
使用字符串拷贝函数或者内存拷贝函数
strcpy只会拷贝字符串,当遇到空时停止拷贝。
memcpy会拷贝固定长度,不限于类型

unsigned char * data[16];
char name[12]={"tiemoxiaoge"}
strcpy(&data[1],name);
memcpy(&data[1],name,13);

0x2-- 十进制整形转十六进制整形

转换是很容易的,但有个问题是2018是转为7E2,而我们需要一个两字节的数,也就是说需要转换为07E2,其实通过格式化函数sprintf,就可以很好解决。sprintf可以设置转换的字宽,左右对齐,是否补零等。

int  num_16;
int num_10=2018;
sprintf(num_16, "%04x",num_10);
memcpy(&data[12],num_16,2);

0x3–十六进制字符串转十六进制整形

 long transfrom_16_int(char * s)
{
	int i, m, n;
	long temp = 0;
	m = strlen(s);
	for (i = 0; i<m; i++)
	{
		if (s[i] >= 'A'&&s[i] <= 'F')a=10。。
			n = s[i] - 'A' + 10;
		else if (s[i] >= 'a'&&s[i] <= 'f')
			n = s[i] - 'a' + 10;
		else n = s[i] - '0';
		temp = temp * 16 + n;
		//dbg_print("temp==%d", temp);
	}
	return temp;
}

猜你喜欢

转载自blog.csdn.net/qq_35651984/article/details/84075630