处理C中的比特流

时间:2011-06-20 20:57:12

标签: c communication signal-processing

我正在C中编写一些具有通信通道的信号处理代码。在输出处,当它们到达时我得到一堆位。

for (n=0; n<BUFFER_LENGTH; n++) {
    /* do some processing that calculates x */
    output[n] = x > 0;
}

以下是我的问题:

  1. 是否有好的代表类型 输出数组?起初我想 uint1_t会很理想,但我听到了 这不一定代表 内存中有一点。
  2. 一旦找到了 我知道的数据中的同步模式 下一位的格式,我该怎么办 转换一堆1和0的 数组成整数,浮点数, 双打,人物等?我听说过用过 一个联盟,但我认为这不会起作用 位数。

4 个答案:

答案 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编程中完成的。