module Base91
Constants
- AVERAGE_ENCODING_RATIO
- DECODING_TABLE
- ENCODING_TABLE
- VERSION
Public Class Methods
decode(data)
click to toggle source
# File lib/base91.rb, line 116 def self.decode data len = data.length estimated_size = (len / AVERAGE_ENCODING_RATIO).to_i | 0 dbq = 0 dn = 0 dv = -1 i = 0 o = -1 byte = 0 output = Array.new(estimated_size) ##check here if data.is_a? String (0..len-1).each do |i| byte = data[i].ord if DECODING_TABLE[byte] != 91 if dv == -1 dv = DECODING_TABLE[byte] else dv+=(DECODING_TABLE[byte] * 91) dbq = dbq | (dv << dn) if dv & 8191 > 88 dn+=13 else dn+=14 end loop do if ((o+=1) > estimated_size) output << (dbq & 0xFF) else output[o] = dbq & 0xFF end dbq = dbq >> 8 dn-=8 break if dn<=7 end dv = -1 end end end else (0..len-1).each do |i| byte = data[i] if DECODING_TABLE[byte] != 91 if dv == -1 dv =DECODING_TABLE[byte] else dv += (DECODING_TABLE[byte] * 91) dbq = dbq | dv << dn if (dv & 8191) > 88 dn += 13 else dn += 14 end loop do if ((o+=1) > estimated_size) output << (dbq & 0xFF) else output[o] = (dbq & 0xFF) end dbq = dbq >> 8 dn-=8 break if dn<=7 end dv = -1 end end end end if dv != -1 if (o+=1) >= estimated_size output << (dbq | dv << dn) else output[o] = (dbq | dv << dn) end end if o > -1 && o < estimated_size -1 output = output[0..o+1] end return output.map(&:chr).join("") end
encode(data)
click to toggle source
# File lib/base91.rb, line 35 def self.encode data len = data.length output = '' ebq = 0 en = 0 ev = 0 j = 0 byte = 0 lenj = 0 if data.is_a? String (0..len-1).each do |i| byte = data[i].ord if byte < 128 lenj = 1 elsif byte > 127 && byte < 2048 lenj = 2 else lenj = 3 end for j in 0..lenj-1 if lenj == 1 ebq = ebq | byte << en elsif lenj == 2 if j == 0 ebq = ebq | (((byte >> 6) | 192)) << en else ebq = ebq | ((byte & 63) | 128) << en end else if j == 0 ebq = ebq | (((byte >> 12) | 224) << en) elsif j == 1 ebq = ebq | ((((byte >> 6) & 63) | 128) << en) else ebq = ebq | (((byte & 63) | 128) << en) end end end en+=8 if en > 13 ev = ebq & 8191 if ev > 88 ebq = ebq >> 13 en-=13 else ev = ebq & 16383 ebq = ebq >> 14 ebq-=14 end output << "#{ENCODING_TABLE[ev%91]}#{ENCODING_TABLE[(ev/91) | 0]}" end end else (0..len-1).each do |i| ebq = ebq | (data[i] & 255) << en en += 8 if en > 13 ev = ebq & 8191 if ev > 88 ebq = eqb >> 13 en -= 13 else ev = ebq & 16383 ebq = ebq >> 14 en -= 14 end output << "#{ENCODING_TABLE[ev%91]}#{ENCODING_TABLE[(ev/91) | 0]}" end end end if en > 0 output+= ENCODING_TABLE[ebq % 91] if en > 7 || ebq > 90 output << ENCODING_TABLE[(ebq / 91) | 0] end end return output end