1. 程式人生 > >C--十六進位制整形和字串的相互轉換

C--十六進位制整形和字串的相互轉換

前言

十六進位制整形:6B746d656d6f7869616667650007e26B
十進位制字串:“ktiemoxiaoge ‘\07’ '\226’k"
十六進位制字串“6B746d656d6f7869616667650007e26B”
有什麼用呢??在網路通訊中,常常要制定一定的通訊格式。比如我制定,我要傳送16位元組的資料,其中字首和字尾都是一位元組為6B,中間為12位元組的傳送者姓名,加上兩位元組的傳送的數字。這時候,我們需要一個16位元組的記憶體,將字串的姓名,整形的數字打包進去。如“tiemoxiaoge”要轉換成746d656d6f78696166676500,數字2018要轉換成07e2。同樣接收方也需要進行相反的操作。而轉換為十六進位制字串常常用於除錯,因為ascii字元只支援到127,而網路通訊中會超過127如上面‘\07’和‘\226’就無法顯示
注:這裡的十六進位制字串代表每位元組是十六進位制整數的字串,而十六進位制整形真的就是整形了。

0x0–十六進位制整形轉十六進位制字串

先講16整形除以10獲得每一位,將每一位拷貝到陣列中,拷貝資料到陣列頭。

	unsigned long long data_int = 0x64ab78676;
	long long  temp,temp_2=1,temp_3=0;
	char data_char[NUM];
	do 
	{
		temp_3++;
		printf("%d\n", data_int % 16);
		temp = data_int % 16;
		if (temp>=0xa&&temp<=0xf)
		{
			data_char[NUM -
temp_2++]=temp+'a'-10; } else if(temp>=0xA&&temp<=0xF) { data_char[NUM - temp_2++] = temp + 'A' - 10; } else if (temp >= 0x1&& temp <= 9) { data_char[NUM - temp_2++] = temp + '0' ; } else { return -1; } } while (data_int = data_int / 16); char data_buf[
NUM]{0}; memcpy(data_buf, &data_char[NUM - temp_3], temp_3); memset(data_char, 0, NUM); memcpy(data_char, data_buf, NUM); printf("%s\n", data_char);

0x1-- 十進位制字串轉十六進位制整形

字串本身不用轉換,只需要將字串的記憶體移植過去
使用字串拷貝函式或者記憶體拷貝函式
strcpy只會拷貝字串,當遇到空時停止拷貝。
memcpy會拷貝固定長度,不限於型別

unsigned char * data[16];
char name[12]={"tiemoxiaoge"}
strcpy(&data[1],name);
memcpy(&data[1],name,13);

0x2-- 十進位制整形轉十六進位制整形

轉換是很容易的,但有個問題是2018是轉為7E2,而我們需要一個兩位元組的數,也就是說需要轉換為07E2,其實通過格式化函式sprintf,就可以很好解決。sprintf可以設定轉換的字寬,左右對齊,是否補零等。

int  num_16;
int num_10=2018;
sprintf(num_16, "%04x",num_10);
memcpy(&data[12],num_16,2);

0x3–十六進位制字串轉十六進位制整形

 long transfrom_16_int(char * s)
{
	int i, m, n;
	long temp = 0;
	m = strlen(s);
	for (i = 0; i<m; i++)
	{
		if (s[i] >= 'A'&&s[i] <= 'F')a=10。。
			n = s[i] - 'A' + 10;
		else if (s[i] >= 'a'&&s[i] <= 'f')
			n = s[i] - 'a' + 10;
		else n = s[i] - '0';
		temp = temp * 16 + n;
		//dbg_print("temp==%d", temp);
	}
	return temp;
}