这里写自定义目录标题
设计思路
一般思路
一般如果需要将十进制转化成十六进制,先定义一个int data,然后从高位到地位遍历十进制字符串,将数据一位位的添加到data中,最后将data转成十六进制字符串输出就可以了,那么先来看看怎么转化成data
int string2int(const char *src_buf)
{
int data = 0;
pos = 0;
while (0 != src_buf[pos])
{
data = data * 10 + src_buf[pos] - ‘0’;
pos ++;
}
return data;
}
对于不定长字符长怎么处理?
根据上面的思路,我们还是需要定义一个大的buffer,用来存放十进制转化得来的特殊类型
const char* string2int(const char *src_buf)
{
// 申请大内存并初始化为0
int src_len = strlen(src_buf);
unsigned char *data_buf = (unsigned char *)malloc(src_len);
memset(data_buf, 0, src_len);
// 取一位然后添加到buffer
pos = 0;
while (0 != src_buf[pos])
{
add_dec_to_last(data_buf, src_len, src_buf[pos] - ‘0’);
pos ++;
}
return data_buf;
}
将数据添加到buffer中
void add_dec_to_last(unsigned char *data_buf, int data_len, int num)
{
unsigned int mul_data = 0;
unsigned char up_data = num;//用来存放进位
for (int i = 0;i < data_len;i ++)
{
mul_data = data_buf[i];
mul_data = mul_data * 10;
data_buf[i] = (mul_data & 0x00FF) + up_data;
up_data = (mul_data >> 8) & 0x00FF;
}
}
完整代码
#include <stdio.h>
#include <string.h>
#include <malloc.h>
const char HexToChar[] = {'0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f'};
void add_dec_to_last(unsigned char *data_buf, int data_len, int num)
{
unsigned int mul_data = 0;
unsigned char up_data = num;
for (int i = 0;i < data_len;i ++)
{
mul_data = data_buf[i];
mul_data = mul_data * 10;
data_buf[i] = (mul_data & 0x00FF) + up_data;
up_data = (mul_data >> 8) & 0x00FF;
}
}
const unsigned char* string2int(const char *src_buf, int *data_len)
{
// 申请大内存并初始化为0
int src_len = strlen(src_buf);
unsigned char *data_buf = (unsigned char *)malloc(src_len);
memset(data_buf, 0, src_len);
// 取一位然后添加到buffer
int pos = 0;
while (0 != src_buf[pos])
{
add_dec_to_last(data_buf, src_len, src_buf[pos] - '0');
pos ++;
}
*data_len = src_len;
return data_buf;
}
void dec_to_hex(const char *src_buf, char *dst_buf)
{
int data_len;
const unsigned char* data_buf = string2int(src_buf, &data_len);
// 去掉字符开头的0
int data_pos = data_len - 1;
while (data_buf[data_pos] == 0)
{
data_pos --;
}
// 将数据存入buffer
for (int i = data_pos,j = 0;i >= 0;j += 2,i --)
{
dst_buf[j] = HexToChar[(data_buf[i] >> 4) & 0x0F];
dst_buf[j + 1] = HexToChar[data_buf[i] & 0x0F];
}
dst_buf[(data_pos + 1) << 1] = 0;
free((unsigned char*)data_buf);
}
int main()
{
char input[50];
char output[50];
printf("Input:");
scanf("%s",input);
dec_to_hex(input, output);
printf("output:%s\n",output);
}