數據的編碼(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)其他只能使用文本的場合

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章