2015-04-09 4 views
1

Так, как и в заголовке, я пытаюсь преобразовать шестнадцатеричный в двоичный файл. Но проблема, с которой я столкнулся, заключается в том, что данное значение является типом uint32_t. До сих пор я преобразовал из uint32_t в uint8_t, поэтому каждая из переменных uint8_t содержит 8 бит исходного шестнадцатеричного значения. Я успешно конвертировал шестнадцатеричный в двоичный код в коде, показанном ниже. Но теперь я не могу напечатать его в определенном формате.Преобразовать значение uint8_t в двоичное значение

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; 
    } 

Хотя я думаю, что основная идея состоит в том, что на каждой итерации Len из 32 битов должны быть преобразованы в двоичную и печататься, я не был в состоянии включить эту идею в свой код. Поэтому я решил преобразовать весь шестнадцатеричный номер и попытаться напечатать только то, что нужно.

+0

Я думаю, что вы запутались. «hexidecimal» и «binary» - это способы представления значений в виде письменного текста. Если у вас есть 'uint32_t', который содержит _value_, который является просто числом. Он не является ни шестнадцатеричным, ни двоичным. Он _looks_, как будто вы преобразовываете это значение в массив бит? Что такое _not_ 'uint8_t'? Я не вижу ничего, в том числе и гекса. –

ответ

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; 
+0

Не могли бы вы объяснить, почему вы используете «И» здесь? Потому что, когда я меняю значение на 8, например, я получаю a2 = 0xbe, для чего я и собираюсь. Так что, пожалуйста, расскажите, что он делает? – user2948246

+1

Начиная с 0xDEADBEEF, >> 8 производит 0x00DEADBE. & 0xFF затем делает его просто 0x000000BE (что присвоение будет делать в любом случае). –

+0

О, хорошо, понял! – user2948246

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 

Чтобы иметь выводе вы указать, как и ожидалось, вы должны немного изменить функцию toBinary() в коде выше. Помните, что байтом является 8 бит, а не 4! Чтобы иметь нужный формат, просто вставьте «if» в нужное место и запишите пробел ... подсказка: 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(" "); 
    } 
} 
+0

Я отредактировал мой код, чтобы получить ожидаемый результат, но теперь я столкнулся с новой проблемой, как упоминалось в моем отредактированном сообщении. – user2948246

+0

Я добавил в конце своего сообщения функции, которые печатают байт, разделенный на 2 куска 4 бит ... :) –

+0

Какую цель? Я понимаю, что должен иметь выход в 4-х битных кусках! У вашего кода, похоже, есть другое направление! Это сложно, если вам нужно только распечатать бит! ... :) В коде, который я написал выше, требуется только то, что вы используете функцию toBinary2 в конце в главном, а не в toBinary! –

Смежные вопросы