tiantian911 发表于 2013-1-27 05:35:44

Bittorrent的编码模块的ruby代码

最近看了看bt的源码,随手写了些ruby的代码:
def encode(x)case x.class.to_swhen "Float"    encode_num(x)when "Fixnum"    encode_num(x)when "Bignum"    encode_num(x)when "String"    encode_string(x)when "Array"    encode_list(x)when "Hash"    encode_hash(x)else    "unknown"      endenddef encode_num(x)"i#{x.to_s}e"enddef encode_string(x)"#{x.size}:#{x}"enddef encode_list(x)str="l"x.each do |temp|    str+=encode(temp)endstr+="e"enddef encode_hash(x)str="d"x.each do |key,val|    str+=encode(key)    str+=encode(val)      endstr+="e"endputs encode("abcd")             # returns "4:abcd"puts encode(1000)               # returns "i1000e"puts encode()            # returns "li1ei2ei3ee"puts encode({"key" => "value"}) # returns "d3:key5:valuee"

def decode(io)c = io.getccase c.chrwhen 'i'    i = ''    while c = io.getc      if c.chr == 'e'      if i.match(/^(0|-?*)$/)          return i.to_i      end      else      i += c.chr      end    endwhen '0'..'9'    n = c.chr    while b = io.getc      case b.chr      when '0'..'9'      n += b.chr      when ':'      strlen = n.to_i      str = io.read(strlen)      if str.length == strlen          return str      end      end    endwhen 'l'    list = []    while item = decode(io)      list.push(item)    end    return listwhen 'd'    dict = {}    while key = decode(io)      val = decode(io)      dict = val    end    return dictwhen 'e'    return falseendendputs decode(StringIO.new("4:abcd"))puts decode(StringIO.new("i1000e"))puts decode(StringIO.new("li1ei2ei3ee"))puts decode(StringIO.new("d3:key5:valuee"))
页: [1]
查看完整版本: Bittorrent的编码模块的ruby代码