【问题标题】:C: print an integer array as binary dataC:将整数数组打印为二进制数据
【发布时间】:2019-09-26 07:34:55
【问题描述】:

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

【问题讨论】:

  • 样本格式是您为设备配置的任何格式。

标签: c alsa pcm libalsa


【解决方案1】:

最好使用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 &gt;&gt; 1)(为简单起见8位):

~0u否定所有位@

~0u &gt;&gt; 1 987654328 @ shift of level 1 bit和填写0 0111 1111 egate @

【讨论】:

    【解决方案2】:
    #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.*/
      }  
    }
    

    【讨论】:

    • 负符号整数的右移是实现定义的。
    • 我不清楚你的说法。你的意思是考虑有符号整数位我应该将for循环修改为for(bit_size=30; bit_size&gt;=0; bit_size--)
    • 没有。 – data[i] &gt;&gt; bit_size; – 由实现定义,不保证在所有平台上都相同。
    • 但我不清楚这有什么问题。如上所述,他指的是 32 位整数,所以我使用了一个变量 bit_size,其值是使用 for 循环设置的,用于右移数据。请您详细说明或帮助提供解释此内容的网络链接。提前致谢。
    • 用于右移数据。stackoverflow.com/a/4009954/3975177
    【解决方案3】:

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

    这是一个关于如何做到这一点的答案:https://stackoverflow.com/a/112947

    编写完代码后,您应该能够做到:

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

    编辑:

    这样做的好处是您可以(如果您编写代码,显然,顺便说一句有点乏味)使用修饰符:

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

    按照我的编程方式(虽然我还没有机会测试它),它应该打印出来:

    0b1'0101
    

    编辑 2:

    上面的链接解释了一种旧的不推荐使用的方法。但是,它和新的很相似,通过阅读,我可以使用新的方法来实现。

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

    【讨论】:

    • 只有当你告诉你的编译器忽略标准时才有效。
    • @Swordfish 我不知道有任何编译器默认遵循标准。我会说只要你不告诉你的编译器遵循标准它就可以工作:)
    • 我不会回答这样的 &%$!&!
    猜你喜欢
    • 2012-02-23
    • 1970-01-01
    • 2016-06-17
    • 1970-01-01
    • 1970-01-01
    • 2018-10-23
    • 2011-12-04
    • 2013-09-09
    • 1970-01-01
    相关资源
    最近更新 更多