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 所以它小于最小整数,如果整数是 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
#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.*/
}
}
您可以使用 printf
编写自己的二进制打印转换说明符。
这是关于如何做到这一点的 SO 答案:
编码后,您应该能够做到:
printf("%b", 5); /* prints 101 */
编辑:
这样做的好处是您可以(如果您编写代码,很明显,这有点乏味)使用修饰符:
printf("%'#b", 0x15);
我编程的方式(虽然我还没有机会测试它),它应该打印:
0b1'0101
编辑 2:
上面的 link 解释了一种不推荐使用的旧方法。但是,它与新的非常相似,通过阅读它,我可以使用新方法进行实现。
我在这里发布了我的实现:https://codereview.stackexchange.com/q/219994/200418
我想使用 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 位的话。 (请注意,这不是我的代码,但我必须对其进行处理)。 我想获取整个缓冲区数组的二进制值并理解这些值并查找它们以何种方式保存到缓冲区中,以便我可以用这些数据重新创建声波。
最好使用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
#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.*/
}
}
您可以使用 printf
编写自己的二进制打印转换说明符。
这是关于如何做到这一点的 SO 答案:
编码后,您应该能够做到:
printf("%b", 5); /* prints 101 */
编辑:
这样做的好处是您可以(如果您编写代码,很明显,这有点乏味)使用修饰符:
printf("%'#b", 0x15);
我编程的方式(虽然我还没有机会测试它),它应该打印:
0b1'0101
编辑 2:
上面的 link 解释了一种不推荐使用的旧方法。但是,它与新的非常相似,通过阅读它,我可以使用新方法进行实现。
我在这里发布了我的实现:https://codereview.stackexchange.com/q/219994/200418