微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何使用 JS 或节点 JS 从文件中提取碎片信息

如何解决如何使用 JS 或节点 JS 从文件中提取碎片信息

作为我自学过程的一部分,我正在尝试编写一个程序,从文件中创建一个 torrent。 所以我打开了一个torrent文件。我从中得到了这个信息。我想知道什么是“碎片”。以及如何从文件提取这些“碎片”信息。

{
      "infoHash": "d2474e86c95b19b8bcfdb92bc12c9d44667cfa36","name": "nothing.epub","encoding": "UTF-8","created": 1375363666,"createdBy": "uTorrent/3300","comment": "Torrent downloaded from torrent cache at http://itorrents.org","announce": [
        "http://tracker.example.com/announce"
      ],"urlList": [],"files": [
        {
          "path": "nothing.epub","length": 362017
        }
      ],"pieceLength": 16384,"pieces": [
        "1f9c3f59beec079715ec53324bde8569e4a0b4eb","ec42307d4ce5557b5d3964c5ef55d354cf4a6ecc","7bf1bcaf79d11fa5e0be06593c8faafc0c2ba2cf","76d71c5b01526b23007f9e9929beafc5151e6511","0931a1b44c21bf1e68b9138f90495e690dbc55f5","72e4c2944cbacf26e6b3ae8a7229d88aafa05f61","eaae6abf3f07cb6db9677cc6aded4dd3985e4586","27567fa7639f065f71b18954304aca6366729e0b","4773d77ae80caa96a524804dfe4b9bd3deaef999","c9dd51027467519d5eb2561ae2cc01467de5f643","0a60bcba24797692efa8770d23df0a830d91cb35","b3407a88baa0590dc8c9aa6a120f274367dcd867","e88e8338c572a06e3c801b29f519df532b3e76f6","70cf6aee53107f3d39378483f69cf80fa568b1ea","c53b506159e988d8bc16922d125d77d803d652c3","ca3070c16eed9172ab506d20e522ea3f1ab674b3","f923d76fe8f44ff32e372c3b376564c6fb5f0dbe","52164f03629fd1322636babb2c014b7dae582da4","1363965261e6ce12b43701f0a8c9ed1520a70eba","004400a267765f6d3dd5c7beb5bd3c75f3df2a54","560a61801147fa4ec7cf568e703acb04e5610a4d","56dcc242d03293e9446cf5e457d8eb3d9588fd90","c698de9b0dad92980906c026d8c1408fa08fe4ec"
      ]

解决方法

来自BEP-3

片段长度映射到文件被分割成的每个片段中的字节数。为了传输的目的,文件被分成固定大小的片段,除了最后一个可能被截断的片段外,这些片段的长度都相同。片段长度几乎总是 2 的幂,最常见的是 2 18 = 256 K(BitTorrent 3.2 版之前默认使用 2 20 = 1 M)。

pieces 映射到长度为 20 的倍数的字符串。将其细分为长度为 20 的字符串,每个字符串都是相应索引处的piece的SHA1哈希值。

要计算文件的片段哈希,您需要打开文件,读取“片段长度”字节并计算该片段的 SHA1 哈希。继续这样做,直到遇到文件末尾。

如果文件不是片段长度的精确倍数,则允许最终片段小于片段大小。

哦,对于多文件种子,您需要将所有文件视为一个连续的文件,以便分段。这意味着,例如,如果您有两个文件,一个是 100 字节,一个是 500000 字节,那么第一部分将是第一个文件的 100 字节与第二个文件的(段长度 - 100)字节连接。

知道了这一点,你可以使用一些这样的代码从文件中获取第一部分:

var fs = require('fs');
var crypto = require('crypto');

var pieceLength = 16384;
var filename = 'nothing.epub';
const stream = fs.createReadStream(filename,{ start: 0,end: pieceLength - 1 });
var hash = crypto.createHash('sha1');
hash.setEncoding('hex');
stream.on('end',function() {
    hash.end();
    console.log(hash.read());
})
stream.pipe(hash);

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。