Class: Origami::Filter::ASCII85

Inherits:
Object
  • Object
show all
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

A85, AHx, CCF, Fl, RL

Instance Method Summary collapse

Methods included from Origami::Filter

included, #initialize

Instance Method Details

#decode(string) ⇒ Object

Decodes the given data encoded in base85.

string

The data to decode.



113
114
115
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
# File 'lib/origami/filters/ascii.rb', line 113

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 += codelen
  end

  result
end

#encode(stream) ⇒ Object

Encodes given data into base85.

stream

The data to encode.



77
78
79
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
# File 'lib/origami/filters/ascii.rb', line 77

def encode(stream)
  i = 0
  code = "".b
  input = stream.dup

  while i < input.size

    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].unpack1("L>")
    outblock = encode_block(value)

    outblock = "z" if (outblock == "!!!!!") && (addend == 0)

    if addend != 0
      outblock = outblock[0, 4 - addend + 1]
    end

    code << outblock

    i += 4
  end

  code
end