Class representing a filter used to encode and decode data written in base85 encoding.
Decodes the given data encoded in base85.
string |
The data to decode. |
# File lib/origami/filters/ascii.rb, line 126 def decode(string) input = (string.include?(EOD) ? string[0..string.index(EOD) - 1] : string).delete(" \f\t\r\n\00"") i = 0 result = "" while i < input.size do outblock = "" if input[i].ord == "z"[0].ord inblock = 0 codelen = 1 else inblock = 0 codelen = 5 if input.length - i < 5 raise InvalidASCII85StringError.new("Invalid length", result) if input.length - i == 1 addend = 5 - (input.length - i) input << "u" * addend else addend = 0 end # Checking if this string is in base85 5.times do |j| if input[i+j].ord > "u"[0].ord or input[i+j].ord < "!"[0].ord raise InvalidASCII85StringError.new( "Invalid character sequence: #{input[i,5].inspect}", result ) else inblock += (input[i+j].ord - "!"[0].ord) * 85 ** (4 - j) end end raise InvalidASCII85StringError.new( "Invalid value (#{inblock}) for block #{input[i,5].inspect}", result ) if inblock >= 2**32 end 4.times do |p| c = inblock / 256 ** (3 - p) outblock << c.chr inblock -= c * 256 ** (3 - p) end if addend != 0 outblock = outblock[0, 4 - addend] end result << outblock i = i + codelen end result end
Encodes given data into base85.
stream |
The data to encode. |
# File lib/origami/filters/ascii.rb, line 83 def encode(stream) i = 0 code = "" input = stream.dup while i < input.size do if input.length - i < 4 addend = 4 - (input.length - i) input << "\00"" * addend else addend = 0 end inblock = (input[i].ord * 256**3 + input[i+1].ord * 256**2 + input[i+2].ord * 256 + input[i+3].ord) outblock = "" 5.times do |p| c = inblock / 85 ** (4 - p) outblock << ("!"[0].ord + c).chr inblock -= c * 85 ** (4 - p) end outblock = "z" if outblock == "!!!!!" and addend == 0 if addend != 0 outblock = outblock[0,(4 - addend) + 1] end code << outblock i = i + 4 end code end
Generated with the Darkfish Rdoc Generator 2.