最近对数据编码进行了简单的学习,也该写写笔记了。首先说说数据吧,以程序员的角度来说,数据其实就是若干个字节。比如说,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)其他只能使用文本的场合