2008-11-05 28 views
7

Tôi có một khối lớn dữ liệu nhị phân trong mảng char [] mà tôi cần giải thích dưới dạng mảng giá trị 6 bit được đóng gói.C/C++ Mã để xử lý mảng ký tự dưới dạng bitstream

Tôi có thể ngồi xuống và viết một số mã để làm điều này nhưng tôi nghĩ rằng phải có một lớp hay chức năng mở rộng tốt mà ai đó đã viết.

Những gì tôi cần là một cái gì đó như:

int get_bits(char* data, unsigned bitOffset, unsigned numBits); 

vì vậy tôi có thể nhận được nhân vật 6-bit thứ 7 trong các dữ liệu bằng cách gọi:

const unsigned BITSIZE = 6; 
char ch = static_cast<char>(get_bits(data, 7 * BITSIZE, BITSIZE)); 
+0

Có thể nhanh hơn để bạn viết mã. – mdec

+0

điều này sẽ không xảy ra là FIELDATA, phải không? http://www.fourmilab.ch/documents/univac/fieldata.html – warren

+0

Không, đó là Reuters MarketFeed thực sự – AndrewR

Trả lời

4

Điều này có thể không hoạt động đối với các kích thước lớn hơn 8, tùy thuộc vào hệ thống cuối. Về cơ bản, Marco đã đăng tải, mặc dù tôi không hoàn toàn chắc chắn tại sao anh ta lại tập trung một chút vào một thời điểm.

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; 
} 
+0

Điều này đã làm các trick. Cảm ơn. – AndrewR

+0

mẹo nào là hơn 32 bit (ví dụ: "dài")? mã có thể lưu trữ các giá trị trong mảng char trông như thế nào? – Will

7

Boost.DynamicBitset - thử nó.

+0

Vâng, tôi đã xem xét điều đó nhưng tôi đã hy vọng cho một thứ gì đó sẽ đóng gói các bit trở lại vào một int khi tôi nhận chúng ra – AndrewR

1

Tôi nghĩ rằng điều gì đó trong dòng sau đây có thể hoạt động.

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; 
} 

Tôi đã không sửa lỗi hoặc chưa kiểm tra, nhưng bạn có thể sử dụng nó làm điểm bắt đầu.

Ngoài ra, hãy xem xét thứ tự bit của tài khoản. Bạn có thể muốn thay đổi

int bitmask = 1 << (bitoffset & 7); // X&7 is X%8 

để

int bitmask = 1 << (7 - (bitoffset & 7)); // X&7 is X%8 

tùy thuộc vào cách mảng bit đã được tạo ra.

Các vấn đề liên quan