C 将位数组转换为十六进制数
在将表示数字位的整数数组转换为十六进制之前,最好的方法是什么 我当前尝试一次读取四位,然后尝试打印相应的十六进制字符,但我看不到任何输出 以下是我所拥有的:C 将位数组转换为十六进制数,c,C,在将表示数字位的整数数组转换为十六进制之前,最好的方法是什么 我当前尝试一次读取四位,然后尝试打印相应的十六进制字符,但我看不到任何输出 以下是我所拥有的: /** * Maps a 4 bit string in binary to the corresponding * hex digit */ void map_bin_to_hex(char *c) { printf("In mapbin: C = %s\n", c); //This is printin
/**
* Maps a 4 bit string in binary to the corresponding
* hex digit
*/
void map_bin_to_hex(char *c)
{
printf("In mapbin: C = %s\n", c); //This is printing funny output
if(!strcmp(c, "0000")) printf("0");
else if(!strcmp(c, "0001")) printf("1");
else if(!strcmp(c, "0010")) printf("2");
else if(!strcmp(c, "0011")) printf("3");
else if(!strcmp(c, "0100")) printf("4");
else if(!strcmp(c, "0101")) printf("5");
else if(!strcmp(c, "0110")) printf("6");
else if(!strcmp(c, "0111")) printf("7");
else if(!strcmp(c, "1000")) printf("8");
else if(!strcmp(c, "1001")) printf("9");
else if(!strcmp(c, "1010")) printf("A");
else if(!strcmp(c, "1011")) printf("B");
else if(!strcmp(c, "1100")) printf("C");
else if(!strcmp(c, "1101")) printf("D");
else if(!strcmp(c, "1110")) printf("E");
else if(!strcmp(c, "1111")) printf("F");
}
/**
* Reads 4 array elements at a time, passing them to map_bin_to_hex
*/
void bin_array_to_hex(int *b, int length)
{
int i, j, k;
//read 4 bits 16 times
for(i = 0; i < 64; i+=4)
{
char hexB[4];
for(k = 0, j = i; j < (i+4); j++, k++)
{
hexB[k] = b[j];
printf("h[%d] = %d\n", k, hexB[k]);
}
map_bin_to_hex(hexB);
}
printf("\n");
}
int main()
{
// a 64-bit number represented as an array of bits
int x[] =[1,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,1,1,0,0,1,1,0,0,1,1,1,1,1,1,1,1,
1,1,1,1,0,0,0,0,1,0,1,0,1,0,1,0,1,1,1,1,0,0,0,0,1,0,1,0,0,0,1,0];
bin_array_to_hex(x, 64);
}
你就快到了
替换
hexB[k] = b[j];
与
另外,charhexb[4]
需要字符hexB[5]代码>(最后一个字符用于空终止;在调用map\u bin\u to\u hex
之前,不要忘记设置hexB[4]='\0';
)
完成此初始修复后,请查看internet上可用的其他解决方案:您将看到如何在五行或六行中完成整个修复
编辑作为另一个挑战,请查看是否可以使用这两个字符串常量来避免第一个方法中的if-then-else语句的长链:
"0000000100100011010001010110011110001001101010111100110111101111"
"0123456789abcdef"
提示:观察第一个字符串的长度是第二个字符串的四倍 你就快到了
替换
hexB[k] = b[j];
与
另外,charhexb[4]
需要字符hexB[5]代码>(最后一个字符用于空终止;在调用map\u bin\u to\u hex
之前,不要忘记设置hexB[4]='\0';
)
完成此初始修复后,请查看internet上可用的其他解决方案:您将看到如何在五行或六行中完成整个修复
编辑作为另一个挑战,请查看是否可以使用这两个字符串常量来避免第一个方法中的if-then-else语句的长链:
"0000000100100011010001010110011110001001101010111100110111101111"
"0123456789abcdef"
提示:观察第一个字符串的长度是第二个字符串的四倍 虽然您的程序将与一起运行,但如果您不使用strcmp,它可以运行得更快。首先,您可以自己编写一个函数来打印字节的十六进制:
void printHexChar(unsigned char value){
unsigned char lower = value & 0xf; // Use binary 'and' to mask the lower byte
unsigned char upper = (value & 0xf0) >> 4; // Use binary 'and' to mask upper byte
if(lower >= 10) // If lower is in range [10-15], than add a value [0-5] on 'a'.
lower = 'a' + (lower - 10);
else
lower = lower + '0'; // It's in range [0-9], so we have to add it to '0'.
if(upper >= 10) // Same as lower
upper = 'a' + (upper - 10);
else
upper = upper + '0';
printf("%c%c",upper,lower); // Print out the hexadecimal number
}
这将使您能够以十六进制打印uint8\u t
(长度为8位的无符号整数)。如果您不知道>
运算符:它将所有位右移n次。例如,23>>2=5
因为23=[10111],[10111]>>2=[101]=5。运算符虽然您的程序将与一起运行,但如果您不使用strcmp,它可以运行得更快。首先,您可以自己编写一个函数来打印字节的十六进制:
void printHexChar(unsigned char value){
unsigned char lower = value & 0xf; // Use binary 'and' to mask the lower byte
unsigned char upper = (value & 0xf0) >> 4; // Use binary 'and' to mask upper byte
if(lower >= 10) // If lower is in range [10-15], than add a value [0-5] on 'a'.
lower = 'a' + (lower - 10);
else
lower = lower + '0'; // It's in range [0-9], so we have to add it to '0'.
if(upper >= 10) // Same as lower
upper = 'a' + (upper - 10);
else
upper = upper + '0';
printf("%c%c",upper,lower); // Print out the hexadecimal number
}
这将使您能够以十六进制打印uint8\u t
(长度为8位的无符号整数)。如果您不知道>
运算符:它将所有位右移n次。例如,23>>2=5
因为23=[10111],[10111]>>2=[101]=5。Zeta回答的运算符,在=10的情况下,应包含在第一个条件中。因此,修改后的代码如下所示
如果Zeta的答案(下限>=10),则=10的情况应包含在第一个条件中。因此,修改后的代码如下所示
如果(较低>=10)谢谢,这是非常有效的。您能告诉我将“0”添加到b[j]中的操作是什么吗?这是某种隐式转换吗?您正在打印printf
中的字符编号1。添加“0”会将其偏移,使其成为字符“0”或“1”。@HunterMcMillen Dervall解释得非常正确:strcmp
需要ASCII数字字符串,但原始程序传递的是不可打印的字符字符串。@dasblinkenlight可能不是您所想的线索,但我有一个新的解决方案,它要短得多,我把它贴在上面。@HunterMcMillen,很好。您可以通过使用我的编辑中的字符串常量#2替换字符数组初始值设定项来进一步缩短它-这是一样的:char hexMap[]=“0123456789ABCDEF”代码>谢谢,这非常有效。您能告诉我将“0”添加到b[j]中的操作是什么吗?这是某种隐式转换吗?您正在打印printf
中的字符编号1。添加“0”会将其偏移,使其成为字符“0”或“1”。@HunterMcMillen Dervall解释得非常正确:strcmp
需要ASCII数字字符串,但原始程序传递的是不可打印的字符字符串。@dasblinkenlight可能不是您所想的线索,但我有一个新的解决方案,它要短得多,我把它贴在上面。@HunterMcMillen,很好。您可以通过使用我的编辑中的字符串常量#2替换字符数组初始值设定项来进一步缩短它-这是一样的:char hexMap[]=“0123456789ABCDEF”代码>转换为字符
有点繁重。我将使用位移位来获得一个整数,然后sprintf
我似乎想不出更好的解决方案,有没有更简单的方法将位数组转换为十六进制值?转换为char
有点重。我将使用位移位来获得一个整数,然后sprintf
我似乎想不出更好的解决方案,有没有更简单的方法将位数组转换为十六进制值?