12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667 |
- #!/usr/bin/ruby
- # Implementation of the Variable Length Run Encoding.
- # Reference:
- # Data Compression (Summer 2023) - Lecture 5 - Basic Techniques
- # https://youtube.com/watch?v=TdFWb8mL5Gk
- func VLR_encoding (String str) {
- var bitstream = []
- for c,v in (str.chars.run_length) {
- bitstream << c.ascii2bin
- if (v == 1) {
- bitstream << '0'
- }
- else {
- var t = v.as_bin
- bitstream << ('1'*(t.len-1) + '0' + t.substr(1))
- }
- }
- bitstream.join
- }
- func VLR_decoding (String bitstring) {
- var decoded = []
- var bits_fh = bitstring.open_r(:raw)
- while (!bits_fh.eof) {
- var s = 8.of { bits_fh.getc }.join
- var c = pack('B*', s)
- var bl = (^Inf -> first { bits_fh.getc != '1' })
- decoded << c
- if (bl > 0) {
- decoded << c*(Num('1' + bl.of { bits_fh.getc }.join, 2)-1)
- }
- }
- decoded.join
- }
- var str = join('', 'a'*13, 'b'*14, 'c'*10, 'd'*3, 'e'*1, 'f'*1, 'g'*4)
- var enc = VLR_encoding(str)
- var dec = VLR_decoding(enc)
- say enc
- say dec
- assert_eq(dec, str)
- with (File(__FILE__).read(':raw')) {|str|
- var enc = VLR_encoding(str)
- assert(enc.len < 8*str.len)
- assert_eq(VLR_decoding(enc), str)
- }
- __END__
- 011000011110101011000101110110011000111110010011001001010110010100110011000110011111000
- aaaaaaaaaaaaabbbbbbbbbbbbbbccccccccccdddefgggg
|