C--十六進位制整形和字串的相互轉換
阿新 • • 發佈:2018-11-19
前言
十六進位制整形: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;
}