c - 如何从字节可寻址数组中解析出 n 位元素

标签 c parsing bit-fields

我有一个只能以 8 位字节寻址的数据流,我想将其解析为 6 位元素并将其存储到一个数组中。有什么最知名的方法可以做到这一点吗?

11110000 10101010 11001100 

进入

像这样的数组

111100|001010|101011|001100

(可以有零填充,只需要这样寻址)

数据是一个 8 位数组,也是 6 位的倍数,不是真的无穷无尽

最佳答案

取决于一个字节在您的特定架构上有多少位。在六位架构上,它非常简单:-)

假设一个每字节 8 位的架构,你将不得不按照以下方式做一些事情:

int sixbits(unsigned char* datastream, unsigned int n) {
    int bitpos = n*6;
    return (datastream[bitpos/8] >> bitpos%8)    // lower part of the five bit group
        + (datastream[bitpos/8+1] << 8-bitpos%8) // if bitpos%8>2, we need to add some carry bits from the next char
        & 0x3f;                                  // and finally mask the lowest 6 bits
}

其中 n 是第 n 个 6 位组。任何像样的编译器都会用移位代替除法,用与代替模数。只需在循环中使用此函数即可填充目标数组。

关于c - 如何从字节可寻址数组中解析出 n 位元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1870237/

相关文章:

java - 有没有一种简单的方法可以将此文本解析为 map

Java 格式 yyyy-MM-dd'T'HH :mm:ss. SSSz 转 yyyy-mm-dd HH:mm:ss

parsing - Haskell/Parsec : How do you use the functions in Text. Parsec.Indent?

c - 探索结构包装

c - pThreads如何在没有内存泄漏的情况下终止c中的线程

c - 之前使用memset还需要设置ptr为NULL吗?

C - 如何通过函数增加指向字符串的指针?

c++ - gcc 中的位域字节顺序

c++ - C++ 中的位域

c - 几个 WinMain 问题