最近對數據編碼進行了簡單的學習,也該寫寫筆記了。首先說說數據吧,以程序員的角度來說,數據其實就是若干個字節。比如說,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)其他只能使用文本的場合