c - 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 位,它小于最小整数。(请注意,这不是我的代码,但我必须处理它)。我想获取整个缓冲区数组的二进制值并理解这些值并查找它们以何种方式保存到缓冲区中,以便我可以使用这些数据重新创建声波。
解决方案
最好使用数组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
推荐阅读
- python-3.x - 将 url 列的值一一传递给 Python 中的网络爬虫代码
- reactjs - 当 createAsyncThunk 返回一个 promise 时如何更新组件(react/redux 工具包)
- javascript - 从 Firebase Cloud Firestore 中提取数据
- r - 我使用“as.layer()”的图表不再起作用
- ios - 图表的集合视图演示:图表 cocoapods 的“没有可用的图表数据”
- proxy - Snowflake ODBC 驱动程序未使用有效的代理环境变量?
- json - 使用命令行打开、编辑和保存文件中的内容
- swift - 使用 urlsession 的 API 发布方法在 swift 中显示错误
- html - 当我调整网站大小时,网页不适合
- flutter - 超时后卡在获取新问题(使用 Flutter)