binary_variable_length_run_encoding.sf 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. #!/usr/bin/ruby
  2. # Implementation of the Variable Length Run Encoding, for a binary string consisting of only 0s and 1s.
  3. # Reference:
  4. # Data Compression (Summer 2023) - Lecture 5 - Basic Techniques
  5. # https://youtube.com/watch?v=TdFWb8mL5Gk
  6. func binary_vrl_encoding (String str) {
  7. var bits = str.chars
  8. var bitstream = [bits[0]]
  9. for c,v in (bits.run_length) {
  10. if (v == 1) {
  11. bitstream << '0'
  12. }
  13. else {
  14. var t = (v-1).as_bin
  15. bitstream << ('1'*t.len + '0' + t.substr(1))
  16. }
  17. }
  18. bitstream.join
  19. }
  20. func binary_vrl_decoding (String bitstring) {
  21. var bits_fh = bitstring.open_r(:raw)
  22. var decoded = []
  23. var bit = bits_fh.getc
  24. while (!bits_fh.eof) {
  25. decoded << bit
  26. var bl = (^Inf -> first { bits_fh.getc != '1' })
  27. if (bl > 0) {
  28. decoded << bit*Num('1' + (bl-1).of { bits_fh.getc }.join, 2)
  29. }
  30. bit = (bit == '1' ? '0' : '1')
  31. }
  32. decoded.join
  33. }
  34. var bitstring = "101000010000000010000000100000000001001100010000000000000010010100000000000000001"
  35. var enc = binary_vrl_encoding(bitstring)
  36. var dec = binary_vrl_decoding(enc)
  37. say enc
  38. say dec
  39. assert_eq(dec, bitstring)
  40. __END__
  41. 1000110101110110111010011110001010101100011110101010000111101110
  42. 101000010000000010000000100000000001001100010000000000000010010100000000000000001