1. 程式人生 > >十六進位制字串轉byte陣列實現

十六進位制字串轉byte陣列實現

字串轉byte陣列,就是實現如下功能:把一個字串,比如“E4F1C3A81F”每兩位作為一個十六進位制數存到一個unsigned char 型的陣列(buf)裡,buf[0] = 0xE4,buf[1] = 0xF1,buf[2] = 0xC3,buf[3] = 0xA8......。我們知道字串中的字元在計算機中大小是其ASCII碼值,比如E的ASCII值是69,但是E如果作為一個十六進位制數,在計算機中的大小是14,所以我們需要找到一種對應關係將字母E(69)->14,同樣將第二位的數字字元4(ASCII:52)->4,並將轉換後的14放到高4位,4放到低4位即可。

完整程式碼實現:

int Change(char s[],unsigned char bits[]) {
	int i,n = 0;
	for(i = 0; s[i]; i += 2) {
		if(s[i] >= 'A' && s[i] <= 'F')
			bits[n] = s[i] - 'A' + 10;
		else bits[n] = s[i] - '0';
		if(s[i + 1] >= 'A' && s[i + 1] <= 'F')
			bits[n] = (bits[n] << 4) | (s[i + 1] - 'A' + 10);
		else bits[n] = (bits[n] << 4) | (s[i + 1] - '0');
		++n;
	}
	return n;
}

如果想實現反轉回去的話,使用下面的程式碼:
string* byteToHexStr(char byte_arr[],int arr_len)
{
	string*  hexstr=new string();
	for (int i=0;i<arr_len;i++)
	{
		char hex1;
		char hex2;
		int value=byte_arr[i];
		int v1=value/16;
		int v2=value % 16;

		if (v1>=0&&v1<=9)
			hex1=(char)(48+v1);
		else
			hex1=(char)(55+v1);

		if (v2>=0&&v2<=9)
			hex2=(char)(48+v2);
		else
			hex2=(char)(55+v2);

		*hexstr=*hexstr+hex1+hex2;
	}
	return hexstr;
}

其實如果轉換成char型陣列的話,對於計算機來說是一樣的,因為轉換後的值在計算機中都是二進位制來存在的,但對於我們使用者可能不太一樣,因為char型的值最高位是一個符號位,而unsigned char型最高位是數值位,所以說如果最高位為1,那麼在char裡就是一個負值,如果最高位為0的話,是沒有區別的。