tags:

views:

86

answers:

0

Hello. I'm looking for help with converting C++'s custom RLE unpack function to Ruby style.

struct packer_opcap {
    unsigned char tlen : 3;
    bool tzero : 1;
    unsigned char blen : 3;
    bool bzero : 1;
};

static void rle_unpack(const unsigned char* in_buf, int in_length, std::vector<unsigned char> &buffer)
{
    buffer.clear();
    if(in_length == 0)
        return;

    const unsigned char *end = in_buf + in_length;
    while (in_buf < end)
    {

        const packer_opcap opcap = *(reinterpret_cast<const packer_opcap*>(in_buf++));
        if (opcap.tzero) {
            unsigned char count = opcap.tlen + 1;
            for (; count > 0; count--)
            {
                buffer.push_back(0);
            }
        } else {
            unsigned int count = 8 - opcap.tlen;
            for (; count > 0 && in_buf < end ; count--) {
                buffer.push_back(*in_buf++);
            }
        }
        if (opcap.bzero) {
            unsigned char count = opcap.blen + 1;
            for (; count > 0; count--)
            {
                buffer.push_back(0);
            }
        } else {
            unsigned int count = 8 - opcap.blen;
            for (; count > 0 && in_buf < end ; count--) {
                buffer.push_back(*in_buf++);
            }
        }
    }
}

input data as hex: "F4 B0 FE EA 0B 08 C0 59 40 F0 F6 E2 06 15 A0 71 CA 01 ED 78 15 52 96 A7 01 81 93 B5 93 03 A0 96 98 A3 CC CD C9 01 05 A3 03 06 FF 7F 5A"

Can some1 help? Or do it for me? ;)