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? ;)