variable_length_run_encoding_2.sf 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. #!/usr/bin/ruby
  2. # Implementation of the Variable Length Run Encoding.
  3. # Reference:
  4. # Data Compression (Summer 2023) - Lecture 5 - Basic Techniques
  5. # https://youtube.com/watch?v=TdFWb8mL5Gk
  6. func VLR_encoding (String str) {
  7. var bitstream = []
  8. for c,v in (str.chars.run_length) {
  9. bitstream << c.ascii2bin
  10. if (v == 1) {
  11. bitstream << '0'
  12. }
  13. else {
  14. var t = v.as_bin
  15. bitstream << ('1'*(t.len-1) + '0' + t.substr(1))
  16. }
  17. }
  18. bitstream.join
  19. }
  20. func VLR_decoding (String bitstring) {
  21. var decoded = []
  22. var bits_fh = bitstring.open_r(:raw)
  23. while (!bits_fh.eof) {
  24. var s = 8.of { bits_fh.getc }.join
  25. var c = pack('B*', s)
  26. var bl = (^Inf -> first { bits_fh.getc != '1' })
  27. decoded << c
  28. if (bl > 0) {
  29. decoded << c*(Num('1' + bl.of { bits_fh.getc }.join, 2)-1)
  30. }
  31. }
  32. decoded.join
  33. }
  34. var str = join('', 'a'*13, 'b'*14, 'c'*10, 'd'*3, 'e'*1, 'f'*1, 'g'*4)
  35. var enc = VLR_encoding(str)
  36. var dec = VLR_decoding(enc)
  37. say enc
  38. say dec
  39. assert_eq(dec, str)
  40. with (File(__FILE__).read(':raw')) {|str|
  41. var enc = VLR_encoding(str)
  42. assert(enc.len < 8*str.len)
  43. assert_eq(VLR_decoding(enc), str)
  44. }
  45. __END__
  46. 011000011110101011000101110110011000111110010011001001010110010100110011000110011111000
  47. aaaaaaaaaaaaabbbbbbbbbbbbbbccccccccccdddefgggg