-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathvariable_length_run_encoding_2.sf
66 lines (47 loc) · 1.37 KB
/
variable_length_run_encoding_2.sf
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
#!/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