数据的编码(1)之十六 进制编码

最近对数据编码进行了简单的学习,也该写写笔记了。首先说说数据吧,以程序员的角度来说,数据其实就是若干个字节。比如说,IP地址对程序员来说是这么表示的unsigned char[ip] = {192, 168, 1, 100},也写以写成 C0 A8 01 64 , IP地址就是数据,它是由4个字节组成,他是数据一种表示方式。当我们通过短信发送数据时,可以选择很多种方式,可以选择如下:

(1)发送 77,90,144,0,3,0
(2)发送 4D5A90000300 (十六进制编码)
(3)发送 TVqQAAMA (base64编码)

其原则为:需要把数据文本化,因为短信里只能输入文本。相比之下,(2)比(1)要短,(3)比(2)要短

十六进制表示法:把每个字节转成2个字符来表示。原数据长度为N,则转换成的长度为2*N。把数据转成文本,是一种转换算法,并非加密,你的秘密没有被得到保护。

下面就写两个方法,字节与十六进制之间的转换;

unsigned char Hex2Int(char ch)
{
	unsigned char val = 0;
	if ('a' <= ch && ch <= 'f')
	{
		return 10 + ch - 'a';
	}
	else if ('A' <= ch && ch <= 'F')
	{
		return 10 + ch - 'A';
	}
	else if (ch >= '0' && ch <= '9')
	{
		return ch - '0';
	}
}
//data:数据   n数据的长度   hex用于存放输出的字符
int Encode(const unsigned char* data , int n , char* hex)
{
	int count = 0;
	for (int i = 0; i < n; i++)
	{
		//转成十六进制
		char buf[3];
		sprintf(buf , "%02X" , data[i]);

		//复制输出
		hex[count++] = buf[0];
		hex[count++] = buf[1];
	}
	hex[count] = 0;
	return count;
}
//data用于保存数据的缓冲区   len数据的长度  
int Decode(unsigned char* data , const char* hex , int len)
{
	int count = 0;
	for (int i = 0; i < len; i++)
	{
		//每两个字符还原一个字节的数据
		unsigned char high = Hex2Int(hex[i]);//高四位
		unsigned char low = Hex2Int(hex[i + 1]);//低四位
		data[count++] = (high << 4) + low;
	}
	return count;
}

应用场景:

(1)在URL中传递字节数据,由于在URL中只允许传递文本,所以可以转成文本
(2)在XML中夹杂字节数据,某个节点是字节数据,则转成文本表示
(3)其他只能使用文本的场合

 

你可能感兴趣的:(个人学习总结)