十进制字符串转化成十六进制字符串(不定长)

11 篇文章 0 订阅
本文介绍了将不定长十进制字符串转化为十六进制字符串的设计思路。首先,通过从高位到低位遍历十进制字符串,逐位添加到数据变量中。针对不定长字符,使用一个足够大的缓冲区来存储转换过程中的中间结果。最后,详细展示了完整的代码实现。
摘要由CSDN通过智能技术生成

设计思路

一般思路

一般如果需要将十进制转化成十六进制,先定义一个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);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值