十进制到十六进制单位转换

时间:2014-04-11 02:25:19

标签: c

我有下一个将十进制单位转换为十六进制的代码。例如,我引入数字4095,它返回FFF十六进制,但问题是我希望数字以2字节格式打印,如这个(左边是零):

4095 - > 0FFF, 33 - > 0021

我知道有更简单的方法可以做到这一点:

int number = 4095
printf("%04x",number);

但我想自己做转换和2字节格式,但我不知道如何在左边的程序中做零。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char Hexadecimal(int rest);

int main()
{
    char num_hex,*x,c[2],;
    int number = 4095,d,rest;
    x = calloc(12,sizeof(char));
    for(d = number;d > 0;d/=16)
    {
        rest = d % 16;
        num_hex = Hexadecimal(rest);
        sprintf(c,"%c",num_hex);
        strcat(x,c);
    }
    strrev(x);
    printf("[%s]\n",x);
    return 0;
}

char Hexadecimal(int rest)
{
    char letter;
    switch(rest)
    {
        case 10:
           letter = 'A';
           break;
        case 11:
           letter = 'B';
           break;
        case 12:
           letter = 'C';
           break;
        case 13:
           letter = 'D';
           break;
        case 14:
           letter = 'E';
           break;
        case 15:
           letter = 'F';
           break;
        default:
           letter = '0' + rest;
    }
    return letter;
}

2 个答案:

答案 0 :(得分:1)

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char const  Hexadecimal[] = "0123456789ABCDEF";

int main()
{
    char num_hex,*x,c[2],;
    int number = 4095,d,rest;
    x = calloc(12,sizeof(char));
    for(d = number;d > 0;d/=16)
    {
        rest = d % 16;
        num_hex = Hexadecimal[rest];
        sprintf(c,"%c",num_hex);
        strcat(x,c);
    }
    strrev(x);
    printf("[%s]\n",x);
    return 0;
}

答案 1 :(得分:0)

我认为用二进制算法来思考这些问题会更容易。

这是一个使用二进制数学而不使用标准库函数的实现。它是以一般方式编写的,因此您可以将short替换为intlong并获得类似的正确结果(只要您替换short类型中的char* shortToHex(short value) { static char tmp[(sizeof(short)*2)+3] = "0x"; const char* hex = "0123456789ABCDEF"; int i = sizeof(short); while(i > 0) { i--; char most_significant_nibble = (value >> (i * 8 + 4)) & 0xF; char least_significant_nibble = (value >> (i * 8)) & 0xF; tmp[2 + (sizeof(short)-i-1) * 2] = hex[most_significant_nibble]; tmp[2 + (sizeof(short)-i-1) * 2 + 1] = hex[least_significant_nibble]; } tmp[(sizeof(short)*2)+2] = 0; return tmp; } 类型功能与您想要的类型)。

    static char tmp[(sizeof(short)*2)+3] = "0x";

让我逐行解释,以便您理解。

'\0'

我们需要一个足够大的缓冲区来保存一小段(16位== 2个字节== 4个字符,一般每个字节2个)加上"0x"终结符加上{{ 1}}字符串。

    const char* hex = "0123456789ABCDEF";

我们需要能够根据数组索引获取十六进制字符。

    while(i > 0)
    {
        i--;
        ...
    }

我们需要一个循环计数器,它从短路中的字节数开始倒计时。我们将从最重要的字节开始循环,从左到右构建字符串。

        char most_significant_nibble = (value >> (i * 8 + 4)) & 0xF;
        char least_significant_nibble = (value >> (i * 8)) & 0xF;
        tmp[2 + (sizeof(short)-i-1) * 2] = hex[most_significant_nibble];
        tmp[2 + (sizeof(short)-i-1) * 2 + 1] = hex[least_significant_nibble];

我们要将输入value中的位向右移位,以便所需位位于临时字符的最低位半字节中。我们通过乘以索引来确定要移位多少位(在16位短的情况下,i将开始为1,因为我们递减它,所以我们将{{1}第一次通过循环,并向右移12位,在短路中留下最重要的半字节。第二行将向右移8位并抓住第二个半字节。(依此类推){ {1}}部分确保我们向右移动的4位值是临时1 * 8 + 4中的唯一值。

然后我们将这些临时值放在适当位置的& 0xF数组中。 (数学有点棘手,因为我们的索引是最重要的 - 最高 - 字节的值,但我们希望将字符放在char值的最低点。)

tmp

最后,我们使用tmp终止 tmp[(sizeof(short)*2)+2] = 0; return tmp; 字符串并将其返回。