Class: Origami::Filter::ASCII85
- Inherits:
-
Object
- Object
- Origami::Filter::ASCII85
- Includes:
- Origami::Filter
- Defined in:
- lib/origami/filters/ascii.rb
Overview
Class representing a filter used to encode and decode data written in base85 encoding.
Constant Summary collapse
- EOD =
:nodoc:
"~>"
Constants included from Origami::Filter
Instance Method Summary collapse
-
#decode(string) ⇒ Object
Decodes the given data encoded in base85.
-
#encode(stream) ⇒ Object
Encodes given data into base85.
Methods included from Origami::Filter
Instance Method Details
#decode(string) ⇒ Object
Decodes the given data encoded in base85.
- string
-
The data to decode.
116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 |
# File 'lib/origami/filters/ascii.rb', line 116 def decode(string) input = filter_input(string) i = 0 result = ''.b while i < input.size outblock = "" value = 0 addend = 0 if input[i] == "z" codelen = 1 else codelen = 5 if input.length - i < codelen raise InvalidASCII85StringError.new("Invalid length", input_data: string, decoded_data: result) if input.length - i == 1 addend = codelen - (input.length - i) input << "u" * addend end # Decode the 5 characters input block into a 32 bit integer. begin value = decode_block input[i, codelen] rescue InvalidASCII85StringError => error error.input_data = string error.decoded_data = result raise(error) end end outblock = [ value ].pack "L>" outblock = outblock[0, 4 - addend] result << outblock i = i + codelen end result end |
#encode(stream) ⇒ Object
Encodes given data into base85.
- stream
-
The data to encode.
80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 |
# File 'lib/origami/filters/ascii.rb', line 80 def encode(stream) i = 0 code = "".b input = stream.dup while i < input.size do if input.length - i < 4 addend = 4 - (input.length - i) input << "\0" * addend else addend = 0 end # Encode the 4 bytes input value into a 5 character string. value = input[i, 4].unpack("L>")[0] outblock = encode_block(value) 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 |