就像它在标题中所说的那样,我试图将十六进制转换为二进制。但我遇到的问题是,给定的值是uint32_t类型。 到目前为止,我已经从uint32_t转换为uint8_t,因此每个uint8_t变量都保存原始十六进制值的8位。 我已成功将十六进制转换为二进制,在下面的代码中。但现在我无法以某种格式打印它。
The Format is:
1101 1110 1010 1101 1011 1110 1110 1111
---0 1010 1101 1011 1110 1110 1111
--01 1011 1110 1110 1111
void convert(uint32_t value,bool bits[],int length)
{
uint8_t a0,a1,a2,a3;
int i,c,k,j;
a0 = value;
a1 = value >> 8;
a2 = value >> 16;
a3 = value >> 24;
for(i=0,c=7;i<=7,c>=0;i++,c--)
{
k = a3>>c;
if(k&1)
bits[i] = true;
else
bits[i] = false;
}
for(i=8,c=7;i<=15,c>=0;i++,c--)
{
k = a2>>c;
if(k&1)
bits[i] = true;
else
bits[i] = false;
}
for(i=16,c=7;i<=23,c>=0;i++,c--)
{
k = a1>>c;
if(k&1)
bits[i] = true;
else
bits[i] = false;
}
for(i=24,c=7;i<=31,c>=0;i++,c--)
{
k = a0>>c;
if(k&1)
bits[i] = true;
else
bits[i] = false;
}
for(i=0;i<32;i=i+4)
{
for(j=i;j<i+4;j++)
{
printf("%d",bits[j]);
}
printf(" ");
}
}
void printBits(bool *bits,int length)
{
int len =32,i,j;
int y = len-length-3;
printf("\n");
for(i=0,j=y;i<32,j<32;i++,j++)
{
// Trying to come up with some idea
}
}
int main( int argc, const char * argv[] )
{
uint32_t value = 0xDEADBEEFL;
bool bits[32];
int len;
for ( len = 32; len > 0; len -= 7 )
{
convert (value, bits, len );
printBits (bits, len);
}
return 0;
}
尽管我认为主要思想是在每次迭代时,32位中的len必须转换为二进制并打印,但我无法将该想法合并到我的代码中。所以我决定转换整个十六进制数,并尝试仅打印所需的内容。
答案 0 :(得分:1)
你为一件事情做了太多改变...... i
正在走8..1它应该去7..0(并且i
应该像所有循环计数器一样int
。如果你的未签名就像你拥有它一样,你永远不会<0来停止循环)。此外,您正在解压缩32位值错误:
a0 = (value >> 24) & 0xFF;
a1 = (value >> 16) & 0xFF;
a2 = (value >> 8) & 0xFF;
a3 = value & 0xFF;
答案 1 :(得分:0)
这里有一些解决方案!!!
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
void toBinary(uint8_t a)
{
uint8_t i;
for(i=0x80;i!=0;i>>=1)
printf("%c",(a&i)?'1':'0');
}
void ul32toBinary(uint32_t a)
{
uint32_t i;
for(i=0x80000000;i!=0;i>>=1)
printf("%c",(a&i)?'1':'0');
}
int main(void)
{
uint32_t k=0xDEADBEEF;
uint8_t *x;
int i;
printf("Converting 0xCC:\t");
toBinary(0xCC); puts("");
printf("Converting 0xF1:\t");
toBinary(0xF1); puts("");
printf("Converting 0x%08X:\t",k);
ul32toBinary(k);puts("");
printf("Converting 0x%08X:\t",k);
x=(char *)&k;
//This is valid on little endian CPUs as Intel are!
for(i=3;i>=0;i--) {
toBinary(*(x+i));
printf(" ");
}
puts("");
return 0;
}
这是此代码的输出!
Converting 0xCC: 11001100
Converting 0xF1: 11110001
Converting 0xDEADBEEF: 11011110101011011011111011101111
Converting 0xDEADBEEF: 11011110 10101101 10111110 11101111
要使您指定的输出为EXPECTED,您必须稍微修改上面代码中的函数toBinary()。请记住,一个字节是8位,而不是4位!要获得所需的格式,只需插入&#34;如果&#34;在正确的地方写一个空格...一个提示是:if(i == 0x10){} ... !!!
晚安:)以下代码是用两个半字节4位打印字节的代码:
void toBinary2(uint8_t a)
{
uint8_t i;
for(i=0x80;i!=0;i>>=1) {
printf("%c",(a&i)?'1':'0');
if (i==0x10)
printf(" ");
}
}