module RCNB
RCNB模块
## Example “`ruby require 'rcnb'
RCNB.encode
('Who NB?') # => ȐȼŃƅȓčƞÞƦȻƝƃŖć RCNB.decode
('ȐĉņþƦȻƝƃŔć') # => RCNB
! “`
Constants
- VERSION
@private
Public Class Methods
decode(str,encoding=nil)
click to toggle source
将RCNB密文解码为文本 @param str [String] 密文 @param encoding 文本编码 @return [String] 文本
# File lib/rcnb.rb, line 146 def self.decode(str,encoding=nil) raise ArgumentError,'invalid length' unless (str.size & 1).zero? arr=[] 0.upto( (str.size>>2)-1 ) do |i| i4=i*4 short=decodeShort(str[i4,4]) arr<< (short>>8) arr<< (short&0xFF) end arr<< decodeByte(str[-2,2]) unless (str.size & 2).zero? result=arr.pack('C*') if encoding result=result.force_encoding(encoding) result=result.encode(__ENCODING__) else result=result.force_encoding(__ENCODING__) end result end
encode(str,encoding=nil)
click to toggle source
将文本编码为RCNB密文 @param str [String] 文本 @param encoding 文本编码 @return [String] 密文
# File lib/rcnb.rb, line 130 def self.encode(str,encoding=nil) str=str.encode(encoding) if encoding arr=str.unpack('C*') result='' 0.upto( (arr.size>>1)-1 ) do |i| i2=i*2 result+=encodeShort( arr[i2]<<8 | arr[i2+1] ) end result+=encodeByte(arr[arr.size-1]) unless (arr.size & 1).zero? result end
Private Class Methods
decodeByte(c)
click to toggle source
# File lib/rcnb.rb, line 89 def self.decodeByte(c) nb=false idx=[ IR[c[0]],IC[c[1]] ] if !idx.all? nb=true idx=[ IN[c[0]],IB[c[1]] ] end raise ArgumentError,'not rc/nb' if !idx.all? result=nb ? idx[0]*SB+idx[1] : idx[0]*SC+idx[1] raise ArgumentError,'rc/nb overflow' if result>0x7F nb ? result|0x80 : result end
decodeShort(c)
click to toggle source
# File lib/rcnb.rb, line 102 def self.decodeShort(c) reverse=!IR[c[0]] if reverse idx=[ IR[c[2]],IC[c[3]],IN[c[0]],IB[c[1]] ] else idx=[ IR[c[0]],IC[c[1]],IN[c[2]],IB[c[3]] ] end raise ArgumentError,'not rc/nb' if !idx.all? result=idx[0]*SCNB+idx[1]*SNB+idx[2]*SB+idx[3] raise ArgumentError,'rc/nb overflow' if result>0x7FFF reverse ? result|0x8000 : result end
encodeByte(i)
click to toggle source
# File lib/rcnb.rb, line 60 def self.encodeByte(i) raise ArgumentError,'rc/nb overflow' if i>0xFF if i>0x7F i&=0x7F d,m=i.divmod(SB) "#{CN[d]}#{CB[m]}" else d,m=i.divmod(SC) "#{CR[d]}#{CC[m]}" end end
encodeShort(i)
click to toggle source
# File lib/rcnb.rb, line 72 def self.encodeShort(i) raise ArgumentError,'rc/nb overflow' if i>0xFFFF reverse=false if i>0x7FFF i&=0x7FFF reverse=true end result=[ CR[i/SCNB], CC[i%SCNB/SNB], CN[i%SNB/SB], CB[i%SB] ] result=[ result[2],result[3],result[0],result[1] ] if reverse result.join end