⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 bencode.py

📁 bittorrent source by python. please enjoy
💻 PY
字号:
# The contents of this file are subject to the BitTorrent Open Source License# Version 1.1 (the License).  You may not copy or use this file, in either# source code or executable form, except in compliance with the License.  You# may obtain a copy of the License at http://www.bittorrent.com/license/.## Software distributed under the License is distributed on an AS IS basis,# WITHOUT WARRANTY OF ANY KIND, either express or implied.  See the License# for the specific language governing rights and limitations under the# License.# Written by Petru Palerfrom BitTorrent.translation import _from BitTorrent.obsoletepythonsupport import *from BitTorrent import BTFailuredef decode_int(x, f):    f += 1    newf = x.index('e', f)    n = int(x[f:newf])    if x[f] == '-':        if x[f + 1] == '0':            raise ValueError    elif x[f] == '0' and newf != f+1:        raise ValueError    return (n, newf+1)def decode_string(x, f):    colon = x.index(':', f)    n = int(x[f:colon])    if x[f] == '0' and colon != f+1:        raise ValueError    colon += 1    return (x[colon:colon+n], colon+n)def decode_list(x, f):    r, f = [], f+1    while x[f] != 'e':        v, f = decode_func[x[f]](x, f)        r.append(v)    return (r, f + 1)def decode_dict(x, f):    r, f = {}, f+1    lastkey = None    while x[f] != 'e':        k, f = decode_string(x, f)        if lastkey >= k:            raise ValueError        lastkey = k        r[k], f = decode_func[x[f]](x, f)    return (r, f + 1)decode_func = {}decode_func['l'] = decode_listdecode_func['d'] = decode_dictdecode_func['i'] = decode_intdecode_func['0'] = decode_stringdecode_func['1'] = decode_stringdecode_func['2'] = decode_stringdecode_func['3'] = decode_stringdecode_func['4'] = decode_stringdecode_func['5'] = decode_stringdecode_func['6'] = decode_stringdecode_func['7'] = decode_stringdecode_func['8'] = decode_stringdecode_func['9'] = decode_stringdef bdecode(x):    try:        r, l = decode_func[x[0]](x, 0)    except (IndexError, KeyError, ValueError):        raise BTFailure, _("not a valid bencoded string")    if l != len(x):        raise BTFailure, _("invalid bencoded value (data after valid prefix)")    return rfrom types import StringType, IntType, LongType, DictType, ListType, TupleTypeclass Bencached(object):    __slots__ = ['bencoded']    def __init__(self, s):        self.bencoded = sdef encode_bencached(x,r):    r.append(x.bencoded)def encode_int(x, r):    r.extend(('i', str(x), 'e'))def encode_bool(x, r):    if x:        encode_int(1, r)    else:        encode_int(0, r)        def encode_string(x, r):    r.extend((str(len(x)), ':', x))def encode_list(x, r):    r.append('l')    for i in x:        encode_func[type(i)](i, r)    r.append('e')def encode_dict(x,r):    r.append('d')    ilist = x.items()    ilist.sort()    for k, v in ilist:        r.extend((str(len(k)), ':', k))        encode_func[type(v)](v, r)    r.append('e')encode_func = {}encode_func[Bencached] = encode_bencachedencode_func[IntType] = encode_intencode_func[LongType] = encode_intencode_func[StringType] = encode_stringencode_func[ListType] = encode_listencode_func[TupleType] = encode_listencode_func[DictType] = encode_dicttry:    from types import BooleanType    encode_func[BooleanType] = encode_boolexcept ImportError:    passdef bencode(x):    r = []    encode_func[type(x)](x, r)    return ''.join(r)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -