首页 > 解决方案 > C:将整数数组打印为二进制数据

问题描述

我想使用 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 位,它小于最小整数。(请注意,这不是我的代码,但我必须处理它)。我想获取整个缓冲区数组的二进制值并理解这些值并查找它们以何种方式保存到缓冲区中,以便我可以使用这些数据重新创建声波。

标签: calsapcmlibalsa

解决方案


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


推荐阅读