On Thu, May 17, 2007 at 09:52:51PM +0900, Richard Fairhurst wrote: > I'm writing a bit of Ruby to output SWF files. > > SWF's opcodes and arguments are variable-length streams of bits. They're > packed in direct succession - i.e. not usually padded to byte > boundaries. > > So, for example, you might have > > 00111 5-bit record > 0110101 7-bit record > 0000110 7-bit record > 0001100 7-bit record > 1111101 7-bit record > > which would be packed as > > 0b00111011,0b01010000,0b11000011,0b00111110,0b10000000 > > (the final byte here is null-padded) > > I'm trying to write these opcode by opcode, and get a bytestream out the > end of it. Currently I'm just appending each opcode to a long string > (m+='00111'), and when it comes to writing it out, splitting this every > eight characters and converting back to a single character. But this is > awfully slow. > > Can anyone suggest a faster way? Hmm, sounds like Huffman coding... see Ruby Quiz just gone :-) If speed is critical it might be worth writing a C extension to do it.