c - 如何从C中的1和0数组中获取十六进制数?
问题描述
我正在创建一个程序,它采用十进制数,使其成为 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()
.
推荐阅读
- reactjs - 如何访问 gatsby-theme-material-ui-top-layout 中的 {window, location}
- javascript - 显示来自 firebase 数据库(网络)的当前用户数据
- c - 一种在数组中加总而不加倍的方法
- oracle - 从 docker 镜像 oracle db 恢复容器,无法连接
- java - 检查参数不为空、不为空或为负是什么意思?
- sql - SQL INSERT INTO 请帮忙
- java - Android rx 依次调用多个句子
- r - 如何计算两个字符串之间的匹配位置数?
- php - 使用文本框和按钮从 PHP 更新 SQL
- android - Xamarin.Android 如何将语音到文本句子分成单独的单词