如何从 C 中的 1 和 0 数组中获取十六进制数?
How to obtain a hex number from an array of 1s and 0s in C?
我正在创建一个程序,它采用十进制数,使其成为 IEEE-754 单精度格式,然后从符号位、指数位和尾数位创建一个长度为 8 的十六进制数。我我无法将我制作的由所有需要的位组成的 int 数组转换为十六进制。
我已经尝试了一段代码并且它可以工作但是它确实向后打印结果而且我不确定如何翻转它。我也曾尝试存储在一个数组中,但是当我打印出该数组时,我得到了框。
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(upper >= 10) // Same as lower
upper = 'a' + (upper - 10);
else
upper = upper + '0';
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'.
printf("%c%c",lower,upper); // Print out the hexadecimal number
}
void bin_array_to_hex(int *b, int length){
if(length % 8){
printf("Must be dividable by eight!\n");
return;
}
unsigned int i;
unsigned int j;
for(i = 0; i < length; i = j){
unsigned char a = 0; // Has length of 8 bits
for(j = i; j < i+8; ++j){ // take 8 bits...
a |= b[j]<<(j-i); // and set them in a
}
printHexChar(a);
}
}
bin_array_to_hex(arrayhex2, 32);
我希望 2.5 的输入是 40200000,但它是 00000204。数组取决于输入的浮点数,但对于 2.5,它是 01000000001000000000000000000000。
既然我们已经掌握了所有信息,我可以向您展示一个解决方案。不过,我不会解释相关部分的样板代码。
由于您的数组的所有位都是按顺序排列的,因此您可以将它们一个接一个地移动到目标变量中。我将其命名为 value
。必须对其进行初始化,以防未给出所有位。
#include <stdio.h>
int array[] = {
0, 1, 0, 0, 0, 0, 0, 0,
0, 0, 1, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
};
void bin_array_to_hex(int *b, int length) {
if (length % 8) {
printf("Length must be dividable by eight!\n");
return;
}
unsigned int value = 0;
if (length / 8 > sizeof value) {
printf("Length must be <= %u!\n", 8 * (unsigned int)sizeof value);
return;
}
while (length--) {
value <<= 1;
if (*b) {
value |= 1;
}
b++;
}
printf("%08x\n", value);
}
int main(void) {
bin_array_to_hex(array, sizeof array / sizeof array[0]);
return 0;
}
更多注意事项:
- 不需要额外的局部变量。参数可以看作局部变量,实际上它们在普通环境中的处理方式非常相似。所以我们可以直接使用它们(这里:
b
和length
)。
- 你不需要自制的十六进制打印机。
printf()
可以为您做到这一点。如果您需要字符串中的结果,请使用 sprintf()
.
我正在创建一个程序,它采用十进制数,使其成为 IEEE-754 单精度格式,然后从符号位、指数位和尾数位创建一个长度为 8 的十六进制数。我我无法将我制作的由所有需要的位组成的 int 数组转换为十六进制。
我已经尝试了一段代码并且它可以工作但是它确实向后打印结果而且我不确定如何翻转它。我也曾尝试存储在一个数组中,但是当我打印出该数组时,我得到了框。
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(upper >= 10) // Same as lower
upper = 'a' + (upper - 10);
else
upper = upper + '0';
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'.
printf("%c%c",lower,upper); // Print out the hexadecimal number
}
void bin_array_to_hex(int *b, int length){
if(length % 8){
printf("Must be dividable by eight!\n");
return;
}
unsigned int i;
unsigned int j;
for(i = 0; i < length; i = j){
unsigned char a = 0; // Has length of 8 bits
for(j = i; j < i+8; ++j){ // take 8 bits...
a |= b[j]<<(j-i); // and set them in a
}
printHexChar(a);
}
}
bin_array_to_hex(arrayhex2, 32);
我希望 2.5 的输入是 40200000,但它是 00000204。数组取决于输入的浮点数,但对于 2.5,它是 01000000001000000000000000000000。
既然我们已经掌握了所有信息,我可以向您展示一个解决方案。不过,我不会解释相关部分的样板代码。
由于您的数组的所有位都是按顺序排列的,因此您可以将它们一个接一个地移动到目标变量中。我将其命名为 value
。必须对其进行初始化,以防未给出所有位。
#include <stdio.h>
int array[] = {
0, 1, 0, 0, 0, 0, 0, 0,
0, 0, 1, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
};
void bin_array_to_hex(int *b, int length) {
if (length % 8) {
printf("Length must be dividable by eight!\n");
return;
}
unsigned int value = 0;
if (length / 8 > sizeof value) {
printf("Length must be <= %u!\n", 8 * (unsigned int)sizeof value);
return;
}
while (length--) {
value <<= 1;
if (*b) {
value |= 1;
}
b++;
}
printf("%08x\n", value);
}
int main(void) {
bin_array_to_hex(array, sizeof array / sizeof array[0]);
return 0;
}
更多注意事项:
- 不需要额外的局部变量。参数可以看作局部变量,实际上它们在普通环境中的处理方式非常相似。所以我们可以直接使用它们(这里:
b
和length
)。 - 你不需要自制的十六进制打印机。
printf()
可以为您做到这一点。如果您需要字符串中的结果,请使用sprintf()
.