繁体   English   中英

C:将整数数组打印为二进制数据

[英]C: print an integer array as binary data

我想使用alsa从麦克风录制数据。 该命令:

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

将麦克风数据写入整数缓冲区buf。 (我不确定由..._ readi写入的数据是否甚至是整数值,文档也无法说明。)

但是,如果我遍历缓冲区,数字将毫无意义。 作为示例,我得到buf [60] == -2,600,000,000,因此如果integer为32位,则它小于最小整数。 (请注意,这不是我的代码,但我必须对其进行处理)。 我想获取整个缓冲区数组的二进制值,并弄清楚这些值并查找将它们以哪种方式保存到缓冲区中,以便可以使用此数据重新创建声波。

最好使用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

您可以编写自己的转换说明符,以使用printf以二进制形式进行打印。

这是有关如何执行此操作的解答: https : //stackoverflow.com/a/112947

编写完代码后,您应该可以执行以下操作:

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

编辑:

这样做的好处是,您可以(如果您对其进行编码,显然,这有点乏味)使用修饰符:

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

我编程的方式(尽管我仍然没有机会对其进行测试),它应该打印:

0b1'0101

编辑2:

上面的链接说明了一种过时的旧方法。 但是,它与新方法非常相似,通过阅读它,我可以使用新方法进行实现。

我在这里发布了我的实现: https : //codereview.stackexchange.com/q/219994/200418

#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.*/
  }  
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM