我正在C中编写一些具有通信通道的信号处理代码。在输出处,当它们到达时我得到一堆位。
for (n=0; n<BUFFER_LENGTH; n++) {
/* do some processing that calculates x */
output[n] = x > 0;
}
以下是我的问题:
答案 0 :(得分:2)
只需将数据存储在足够大的字节块中,然后使用移位和屏蔽迭代这些位,以便按顺序提取单个位。
e.g。将缓冲区的内容打印为单独的位:
#include <stdio.h>
#include <stdint.h> // uint8_t et al
#include <limits.h> // CHAR_BIT
uint8_t buffer[256];
int b, bit;
for (b = 0; b < 256; ++b)
{
for (bit = CHAR_BIT - 1; bit >= 0; --bit)
{
uint8_t mask = 1 << bit;
printf("%2d", (buffer[b] & mask) != 0);
}
printf("\n");
}
答案 1 :(得分:0)
您必须以8位的倍数处理它们并且使用屏蔽(&amp;运算符)和自由移位(&gt;&gt;运算符)。 因此,以MP3比特流为例(来自http://www.mp3-tech.org/programmer/frame_header.html):
AAAAAAAA AAABBCCD EEEEFFGH IIJJKLMM
可以保存在一个32位变量或四个8位变量中:
MMLKJJII HGFFEEEE DCCBBAAA AAAAAAAA
在这里你有:
int i = 0;
while (!syncFound)
{
uint16 sync = data[i] | ((data[i + 1] & 0x07) << 8);
if (sync == 0x07ff)
{
// The first 11 bits represent a sync.
uint8 version = (data[i + 1] & 0x18) >> 3;
uint6 layer = (data[i + 1] & 0x60) >> 5);
// etc...
syncFound = TRUE;
} else {
// current byte is not the start of a frame. check if the next byte is.
i++;
}
}
数组边界检查可能会变得乏味,因此处理可变长度标头也是如此。
答案 2 :(得分:0)
假设解析距离中有大量的位,那么你必须进行打包。 考虑循环缓冲区以实现连续操作。 低误码率前提和高熵数据(即一个字节可以取所有值而不仅仅是几个符号),然后基于联合的解码应该更好。在联合之前准备好带有移位的位,或者将一个移位分开八个联合并根据需要调用它们。
答案 3 :(得分:-1)
将它们存储在一个大的Char缓冲区中,在获得数据后,您可以使用转换API(如atoi()atof()等转换为int,浮点数)。 这通常也是在C socket编程中完成的。