我有下一个将十进制单位转换为十六进制的代码。例如,我引入数字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;
}
答案 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
替换为int
或long
并获得类似的正确结果(只要您替换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;
字符串并将其返回。