将字符数组视为比特流的C/C++代码
问题描述:
我在char []数组中有一大块二进制数据,我需要将它解释为打包的6位值的数组。将字符数组视为比特流的C/C++代码
我可以坐下来写一些代码来做到这一点,但我想,必须有一个良好的现存类或函数有人已经写入。
我需要的是这样的:
int get_bits(char* data, unsigned bitOffset, unsigned numBits);
,所以我可以通过调用获取数据第七届6位字符:
const unsigned BITSIZE = 6;
char ch = static_cast<char>(get_bits(data, 7 * BITSIZE, BITSIZE));
答
根据endian系统,这对于大于8的尺寸可能无效。这基本上是马尔科发布的,尽管我不完全确定他为什么一次只能收集一点。
int get_bits(char* data, unsigned int bitOffset, unsigned int numBits) {
numBits = pow(2,numBits) - 1; //this will only work up to 32 bits, of course
data += bitOffset/8;
bitOffset %= 8;
return (*((int*)data) >> bitOffset) & numBits; //little endian
//return (flip(data[0]) >> bitOffset) & numBits; //big endian
}
//flips from big to little or vice versa
int flip(int x) {
char temp, *t = (char*)&x;
temp = t[0];
t[0] = t[3];
t[3] = temp;
temp = t[1];
t[1] = t[2];
t[2] = temp;
return x;
}
答
我认为下列行中的某些内容可能有效。
int get_bit(char *data, unsigned bitoffset) // returns the n-th bit
{
int c = (int)(data[bitoffset >> 3]); // X>>3 is X/8
int bitmask = 1 << (bitoffset & 7); // X&7 is X%8
return ((c & bitmask)!=0) ? 1 : 0;
}
int get_bits(char* data, unsigned bitOffset, unsigned numBits)
{
int bits = 0;
for (int currentbit = bitOffset; currentbit < bitOffset + numBits; currentbit++)
{
bits = bits << 1;
bits = bits | get_bit(data, currentbit);
}
return bits;
}
我没有调试,也没有测试它,但你可以使用它作为一个起点。
另外,考虑位顺序。你可能想
int bitmask = 1 << (bitoffset & 7); // X&7 is X%8
到
int bitmask = 1 << (7 - (bitoffset & 7)); // X&7 is X%8
取决于如何位排列已经产生变化。
可能会更快地编写代码。 – mdec 2008-11-05 07:47:27
这不会是FIELDATA,会吗? http://www.fourmilab.ch/documents/univac/fieldata.html – warren 2008-11-05 13:07:14
那么,这是路透社MarketFeed其实 – AndrewR 2008-11-05 22:01:02