C: вывести целочисленный массив в виде двоичных данных - PullRequest
0 голосов
/ 08 мая 2019

Я хочу записать данные с микрофона, используя alsa.Эта команда:

int buf[4096];
memset(buf, 0, sizeof(buf));
snd_pcm_readi(capture_handle, buf, avail);

записывает данные микрофона в целочисленный буфер buf.(Я не уверен, что данные, которые записываются с помощью ..._ readi, являются даже целочисленными значениями, документация не сообщает.)

Но если я перебираю буфер, числа не имеют смысла.В качестве примера я получаю, что buf [60] == -2 600 000 000, поэтому оно меньше минимального целого числа, если целое число равно 32 бита.(как примечание, это не мой код, но я должен работать над этим).Я хочу получить двоичные значения всего этого буферного массива, разобраться в значениях и посмотреть, как они сохраняются в буфере, чтобы я мог воссоздать звуковую волну с этими данными.

Ответы [ 3 ]

4 голосов
/ 08 мая 2019

Лучше использовать массив char для записи необработанных данных.Но чтобы ответить на ваш вопрос:

#include <limits.h>
#include <stdio.h>

void print_binary(int value)
{
    unsigned mask = ~(~0u >> 1);  // set highest bit

    // iterate over all bits:
    for (size_t i = 0; i < sizeof(value) * CHAR_BIT; ++i) {
        putchar('0' + !!(value & mask));  // !! converts to bool 0 or 1
        mask >>= 1;  // shift to next lower bit
    }
}

int main(void)
{
    int x = 9;
    print_binary(x);
    putchar('\n');
}

Вывод:

00000000000000000000000000001001

Короче:

#include <stdio.h>

void print_binary(int value)
{
    for (unsigned mask = ~(~0u >> 1); mask; mask >>= 1)
        putchar('0' + !!(value & mask));
}

PS: Просто чтобы уточнить ~(~0u >> 1) (8 бит для простоты):

~0u отрицание всех бит 1111 1111~0u >> 1 сдвиг вправо на 1 бит и заполнение 0 0111 1111~(~0u >> 1) отрицать, что 1000 0000

1 голос
/ 08 мая 2019

Вы можете написать свой собственный спецификатор преобразования для печати в двоичном виде с помощью printf.

Вот SO-ответ о том, как это сделать: https://stackoverflow.com/a/112947

После того, как вы его кодируете, выдолжно быть в состоянии сделать:

printf("%b", 5); /* prints 101 */

РЕДАКТИРОВАТЬ:

Хорошая точка зрения по этому поводу, то вы можете тогда (если вы код, очевидно, что, кстати, являетсянемного утомительно) используйте модификаторы:

printf("%'#b", 0x15);

По тому, как я запрограммировал это (у меня все еще не было возможности проверить это), он должен вывести:

0b1'0101

РЕДАКТИРОВАТЬ 2:

Эта ссылка выше объясняет старый устаревший способ сделать это.Тем не менее, он очень похож на новый, и, прочитав его, я смог реализовать реализацию, используя новый метод.

Я разместил свою реализацию здесь: https://codereview.stackexchange.com/q/219994/200418

0 голосов
/ 08 мая 2019
#include<stdio.h>
#include<stdlib.h>
#include<stdint.h>

int main(void) 
{
  int32_t data[5]= {2,1,1,1,1}; /*Example array with small value for easy recognition of binary value */
  int i,array_size,bit_size,bit_print;

  array_size=sizeof(data)/sizeof(data[0]);

  for(i=0;i<array_size;i++)
  {
    for(bit_size=31; bit_size>=0; bit_size--)
    {
        bit_print = data[i] >> bit_size;

        if (bit_print & 1)
          printf("1");
        else
          printf("0");
    }
    printf("\n"); /*this new line is optional if you want to view each value on new line.*/
  }  
}
...