您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Module for encoding/decoding Bencoded data
此脚本不应直接安装。它是供其他脚本使用的外部库,要使用该库请加入元指令 // @require https://update.cn-greasyfork.org/scripts/13016/79776/Bencode%20encoderdecoder.js
// ==UserScript== // @name Bencode encoder/decoder // @description Module for encoding/decoding Bencoded data // @version 1.0 // ==/UserScript== // Copyright: https://github.com/nutbread/t2m var bencode = (function() { "use strict"; // Encoding functions var encode = function (value) { // Type var t = typeof(value); // Number if (t == "number") return encode_int(Math.floor(value)); // String if (t == "string") return encode_string(value); // Array if (Array.isArray(value)) return encode_list(value); // Dict return encode_dict(value); }; var encode_int = function (value) { return "i" + value + "e"; }; var encode_string = function (value) { return "" + value.length + ":" + value; }; var encode_list = function (value) { var str = [ "l" ], i; // List values for (i = 0; i < value.length; ++i) { str.push(encode(value[i])); } // End str.push("e"); return str.join(""); }; var encode_dict = function (value) { var str = [ "d" ], keys = [], i; // Get and sort keys for (i in value) keys.push(i); keys.sort(); // Push values for (i = 0; i < keys.length; ++i) { str.push(encode_string(keys[i])); str.push(encode(value[keys[i]])); } // End str.push("e"); return str.join(""); }; // Decoding class var Decoder = function () { this.pos = 0; }; Decoder.prototype = { constructor: Decoder, decode: function (str) { // Errors var k = str[this.pos]; if (!(k in decode_generic)) throw "Invalid format"; // Call return decode_generic[k].call(this, str); }, decode_int: function (str) { // Skip the "i" prefix ++this.pos; var end = str.indexOf("e", this.pos), value; // No end if (end < 0) throw "Invalid format"; // Assume proper number format value = parseInt(str.substr(this.pos, end - this.pos), 10); // Done this.pos = end + 1; return value; }, decode_string: function (str) { var delim = str.indexOf(":", this.pos), length, value; // No end if (delim < 0) throw "Invalid format"; // Assume proper number format length = parseInt(str.substr(this.pos, delim - this.pos), 10); value = str.substr(delim + 1, length); // Done this.pos = delim + length + 1; return value; }, decode_list: function (str) { // Skip the "l" prefix ++this.pos; // Read list var list = [], value; // Loop until end or exception while (str[this.pos] != "e") { value = this.decode(str); // this throws errors if str[this.pos] is out of bounds list.push(value); } // Done; skip "e" suffix ++this.pos; return list; }, decode_dict: function (str) { // Skip the "d" prefix ++this.pos; // Read dict var dict = {}, key, value; // Loop until end or exception while (str[this.pos] != "e") { key = this.decode_string(str); value = this.decode(str); // this throws errors if str[this.pos] is out of bounds dict[key] = value; } // Done; skip "e" suffix ++this.pos; return dict; } }; // Generic decode functions var decode_generic = { "l": Decoder.prototype.decode_list, "d": Decoder.prototype.decode_dict, "i": Decoder.prototype.decode_int, }, i; for (i = 0; i < 10; ++i) decode_generic[i.toString()] = Decoder.prototype.decode_string; // Encode/decode functions return { /** encode: function (obj) Encodes an object into a Bencode'd string @param obj The object to encode This should only be one of the following: string number (floats are floor'd to integers) array (containing things only from this list) object (containing things only from this list) Strings should be encoded in some way such that each character is in the range [0,255] @return A string representing the object */ encode: encode, /** decode: function (str) Decodes a Bencode'd string back into its original type @param str The string to decode @return The original object represented by str @throws Any one of the following self-explanatory strings "Invalid format" "Invalid string" "Invalid int" */ decode: function (str) { // Create a decoder and call return (new Decoder()).decode(str); }, }; })();