Javascript 如何使用JS或node JS从文件中提取片段信息
作为我自学过程的一部分,我正在尝试编写一个程序,从文件中创建一个torrent。 所以我打开了一个torrent文件。我从中得到了这个信息。我想知道什么是“碎片”。如何从文件中提取这些“碎片”信息Javascript 如何使用JS或node JS从文件中提取片段信息,javascript,node.js,npm,hash,torrent,Javascript,Node.js,Npm,Hash,Torrent,作为我自学过程的一部分,我正在尝试编写一个程序,从文件中创建一个torrent。 所以我打开了一个torrent文件。我从中得到了这个信息。我想知道什么是“碎片”。如何从文件中提取这些“碎片”信息 { "infoHash": "d2474e86c95b19b8bcfdb92bc12c9d44667cfa36", "name": "nothing.epub", "encod
{
"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"
]
发件人:
片段长度映射到文件拆分成的每个片段中的字节数。为了传输的目的,文件被分割成固定大小的片段,除了最后一个可能被截断的片段外,所有片段的长度都相同。工件长度几乎总是2的幂,最常见的是2 18=256 K(3.2版之前的BitTorrent使用2 20=1 M作为默认值)
片段映射到长度为20倍的字符串。它将被细分为长度为20的字符串,每个字符串都是对应索引处片段的SHA1散列
要计算文件的片段散列,您需要打开文件,读取'piece length'字节并计算该片段的SHA1散列。继续这样做,直到你遇到了文件的结尾
{
"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"
]
如果文件不是工件长度的精确倍数,则允许最终工件小于工件尺寸
哦,对于多文件torrents,您需要将所有文件视为一个连续的文件,以便于片段。这意味着,例如,如果您有两个文件,一个100字节,一个500000字节,那么第一个文件的100字节将与第二个文件的(片段长度-100)字节连接在一起
了解这一点后,您可以使用以下代码从文件中获取第一部分:
var fs=require('fs');
var crypto=require('crypto');
var pieceLength=16384;
var filename='nothing.epub';
const stream=fs.createReadStream(文件名,{start:0,end:pieceLength-1});
var hash=crypto.createHash('sha1');
setEncoding('hex');
stream.on('end',function(){
hash.end();
log(hash.read());
})
流管道(散列);
我知道这听起来很愚蠢。但我还是想问。有没有办法从HTTP链接获取这些片段。我的意思是没有完全下载文件。还有Idm是如何下载的。假设服务器支持它,您可以使用字节范围请求执行部分下载,并依次计算每个片段的哈希值。不管您做什么,您仍然需要下载整个文件来计算所有的片段散列。