データの符号化(1)の16進符号化


最近はデータコードを簡単に勉強して、ノートを書くようになりました.まずデータについて話しましょう.プログラマーの立場から言えば、データは実はいくつかのバイトです.例えば、IPアドレスはプログラマーにとってこのように表すunsigned char[ip]={192,168,1,100}であり、C 0 A 8 01 64とも書く.IPアドレスはデータであり、4バイトからなる.彼はデータの一種の表現である.メールでデータを送信する場合は、次のような方法を選択できます.
(1)送信77,90144,0,3,0(2)送信4 D 5 A 90000,300(16進符号化)(3)送信TVqQAMA(base 64符号化)
メールにはテキストしか入力できないので、データをテキスト化する必要があります.それに比べて、(2)は(1)より短く、(3)は(2)より短く
16進数表記:バイトごとに2文字に変換して表記します.元データ長がNの場合、変換された長さは2*Nとなります.データをテキストに変換するのは、暗号化ではなく、あなたの秘密が保護されていない変換アルゴリズムです.
次に、バイトと16進数の変換の2つの方法を書きます.
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)他にテキストしか使用できない場合