| Class | Origami::Filter::ASCII85 |
| In: |
sources/parser/filters.rb
|
| Parent: | Object |
Decodes the given data encoded in base85.
| string: | The data to decode. |
# File sources/parser/filters.rb, line 349
349: def decode(string)
350:
351: input = (string.include?(EOD) ? string[0..string.index(EOD) - 1] : string).delete(" \f\t\r\n\0")
352:
353: i = 0
354: result = ""
355: while i < input.size do
356:
357: if input.length - i < 5
358: then
359: if input.length - i == 1 then raise InvalidASCII85String, "Invalid length" end
360:
361: addend = 5 - (input.length - i)
362: input << "u" * addend
363: else
364: addend = 0
365: end
366:
367: if input[i] == ?z
368: inblock = 0
369: else
370:
371: inblock = 0
372: outblock = ""
373:
374: # Checking if this string is in base85
375: 5.times { |j|
376: if input[i+j] > ?u or input[i+j] < ?!
377: raise InvalidASCII85String, string
378: else
379: inblock += (input[i+j] - ?!) * 85 ** (4 - j)
380: end
381: }
382:
383: if inblock > 2**32 - 1
384: raise InvalidASCII85String, "Invalid value"
385: end
386:
387: end
388:
389: 4.times do |p|
390: c = inblock / 256 ** (3 - p)
391: outblock << c.chr
392:
393: inblock -= c * 256 ** (3 - p)
394: end
395:
396: if addend != 0
397: outblock = outblock[0, 4 - addend]
398: end
399:
400: result << outblock
401:
402: i = i + 5
403: end
404:
405: result
406: end
Encodes given data into base85.
| stream: | The data to encode. |
# File sources/parser/filters.rb, line 306
306: def encode(stream)
307:
308: i = 0
309: code = ""
310: input = stream.dup
311:
312: while i < input.size do
313:
314: if input.length - i < 4
315: addend = 4 - (input.length - i)
316: input << "\0" * addend
317: else
318: addend = 0
319: end
320:
321: inblock = (input[i] * 256**3 + input[i+1] * 256**2 + input[i+2] * 256 + input[i+3])
322: outblock = ""
323:
324: 5.times do |p|
325: c = inblock / 85 ** (4 - p)
326: outblock << (?! + c).chr
327:
328: inblock -= c * 85 ** (4 - p)
329: end
330:
331: if outblock == "!!!!!" and addend == 0 then outblock = "z" end
332:
333: if addend != 0
334: outblock = outblock[0,(4 - addend) + 1]
335: end
336:
337: code << outblock
338:
339: i = i + 4
340: end
341:
342: code
343: end