前言
十六进制整形: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;
}