搜档网
当前位置:搜档网 › 迅雷种子文件——解析Torrent 文件

迅雷种子文件——解析Torrent 文件

迅雷种子文件——解析Torrent 文件
迅雷种子文件——解析Torrent 文件

对于这个类在解析Torrent 文件时候可能有错误,请大家指正。先把文件解析的类贴出来,连接有空再发把。

使用

TorrentFile File = new TorrentFile(openFileDialog1.FileName);

File.TorrentFileInfoClass[] 文件信息

File.TorrentAnnounceList 服务器列表

全部代码

using System;

using System.Collections.Generic;

using System.Text;

using System.Windows.Forms;

using System.Collections;

namespace Zgke.OtherFile

{

///

/// Torrent文件

/// Zgke@https://www.sodocs.net/doc/fe10723401.html,

/// 2008-08-28

///

public class TorrentFile

{

#region 私有字段

private string _OpenError = "";

private bool _OpenFile = false;

private string _TorrentAnnounce = "";

private IList _TorrentAnnounceList = new List();

private DateTime _TorrentCreateTime = new DateTime(1970,1,1,0,0,0);

private long _TorrentCodePage = 0;

private string _TorrentComment = "";

private string _TorrentCreatedBy = "";

private string _TorrentEncoding = "";

private string _TorrentCommentUTF8 = "";

private IList _TorrentFileInfo = new List();

private string _TorrentName = "";

private string _TorrentNameUTF8 = "";

private long _TorrentPieceLength = 0;

private byte[] _TorrentPieces;

private string _TorrentPublisher = "";

private string _TorrentPublisherUTF8 = "";

private string _TorrentPublisherUrl = "";

private string _TorrentPublisherUrlUTF8 = "";

private IList _TorrentNotes = new List();

#endregion

#region 属性

///

/// 错误信息

///

public string OpenError { set { _OpenError = value; } get { return _OpenError; } }

///

/// 是否正常打开文件

///

public bool OpenFile { set { _OpenFile = value; } get { return _OpenFile; } }

///

/// 服务器的URL(字符串)

///

public string TorrentAnnounce { set { _TorrentAnnounce = value; } get { return _TorrentAnnounce; } }

///

/// 备用tracker服务器列表(列表)

///

public IList TorrentAnnounceList { set { _TorrentAnnounceList = value; } get { return _TorrentAnnounceList; } }

///

/// 种子创建的时间,Unix标准时间格式,从1970 1月1日00:00:00到创建时间的秒数(整数)

///

public DateTime TorrentCreateTime { set { _TorrentCreateTime = value; } get { return _TorrentCreateTime; } }

///

/// 未知数字CodePage

///

public long TorrentCodePage { set { _TorrentCodePage = value; } get { return _TorrentCodePage; } }

///

/// 种子描述

///

public string TorrentComment { set { _TorrentComment = value; } get { return _TorrentComment; } }

///

/// 编码方式

///

public string TorrentCommentUTF8 { set { _TorrentCommentUTF8 = value; } get { return _TorrentCommentUTF8; } }

///

/// 创建人

///

public string TorrentCreatedBy { set { _TorrentCreatedBy = value; } get { return _TorrentCreatedBy; } }

///

/// 编码方式

///

public string TorrentEncoding { set { _TorrentEncoding = value; } get { return _TorrentEncoding; } }

///

/// 文件信息

///

public IList TorrentFileInfo { set { _TorrentFileInfo = value; } get { return _TorrentFileInfo; } }

///

/// 种子名

///

public string TorrentName { set { _TorrentName = value; } get { return _TorrentName; } }

///

/// 种子名UTF8

///

public string TorrentNameUTF8 { set { _TorrentNameUTF8 = value; } get { return _TorrentNameUTF8; } }

///

/// 每个块的大小,单位字节(整数)

///

public long TorrentPieceLength { set { _TorrentPieceLength = value; } get { return _TorrentPieceLength; } }

///

/// 每个块的20个字节的SHA1 Hash的值(二进制格式)

///

private byte[] TorrentPieces { set { _TorrentPieces = value; } get { return _TorrentPieces; } }

///

/// 出版

///

public string TorrentPublisher { set { _TorrentPublisher = value; } get { return _TorrentPublisher; } }

///

/// 出版UTF8

///

public string TorrentPublisherUTF8 { set { _TorrentPublisherUTF8 = value; } get { return _TorrentPublisherUTF8; } }

///

/// 出版地址

///

public string TorrentPublisherUrl { set { _TorrentPublisherUrl = value; } get { return _TorrentPublisherUrl; } }

///

/// 出版地址

///

public string TorrentPublisherUrlUTF8 { set { _TorrentPublisherUrlUTF8 = value; } get { return _TorrentPublisherUrlUTF8; } }

///

/// NODES

///

public IList TorrentNotes { set { _TorrentNotes = value; } get { return _TorrentNotes; } }

#endregion

public TorrentFile(string FileName)

{

System.IO.FileStream TorrentFile = new System.IO.FileStream(FileName, System.IO.FileMode.Open);

byte[] TorrentBytes = new byte[TorrentFile.Length];

TorrentFile.Read(TorrentBytes, 0, TorrentBytes.Length);

TorrentFile.Close();

if ((char)TorrentBytes[0] != 'd')

{

if (OpenError.Length == 0) OpenError = "错误的Torrent文件,开头第1字节不是100";

return;

}

GetTorrentData(TorrentBytes);

}

#region 开始读数据

///

/// 开始读取

///

///

private void GetTorrentData(byte[] TorrentBytes)

{

int StarIndex = 1;

while (true)

{

object Keys = GetKeyText(TorrentBytes, ref StarIndex);

if (Keys == null)

{

if (StarIndex >= TorrentBytes.Length) OpenFile = true;

break;

}

if (GetV alueText(TorrentBytes, ref StarIndex, Keys.ToString().ToUpper()) == false) break;

}

}

#endregion

///

/// 读取结构

///

///

///

///

///

private bool GetV alueText(byte[] TorrentBytes,ref int StarIndex, string Keys)

{

switch (Keys)

{

case "ANNOUNCE":

TorrentAnnounce = GetKeyText(TorrentBytes, ref StarIndex).ToString();

break;

case "ANNOUNCE-LIST":

int ListCount = 0;

ArrayList _TempList=GetKeyData(TorrentBytes, ref StarIndex, ref ListCount);

for (int i = 0; i != _TempList.Count; i++)

{

TorrentAnnounceList.Add(_TempList[i].ToString());

}

break;

case "CREA TION DA TE":

object Date = GetKeyNumb(TorrentBytes, ref StarIndex).ToString();

if (Date == null)

{

if (OpenError.Length == 0) OpenError = "CREA TION DA TE 返回不是数字类型";

return false;

}

TorrentCreateTime = TorrentCreateTime.AddTicks(long.Parse(Date.ToString()));

break;

case "CODEPAGE":

object CodePageNumb = GetKeyNumb(TorrentBytes, ref StarIndex);

if (CodePageNumb == null)

{

if (OpenError.Length == 0) OpenError = "CODEPAGE 返回不是数字类型";

return false;

}

TorrentCodePage = long.Parse(CodePageNumb.ToString());

break;

case "ENCODING":

TorrentEncoding = GetKeyText(TorrentBytes, ref StarIndex).ToString();

break;

case "CREA TED BY":

TorrentCreatedBy = GetKeyText(TorrentBytes, ref StarIndex).ToString();

break;

case "COMMENT":

TorrentComment = GetKeyText(TorrentBytes, ref StarIndex).ToString();

break;

case "COMMENT.UTF-8":

TorrentCommentUTF8 = GetKeyText(TorrentBytes, ref StarIndex).ToString();

break;

case "INFO":

int FileListCount = 0;

GetFileInfo(TorrentBytes, ref StarIndex, ref FileListCount);

break;

case "NAME":

TorrentName = GetKeyText(TorrentBytes, ref StarIndex).ToString();

break;

case "NAME.UTF-8":

TorrentNameUTF8 = GetKeyText(TorrentBytes, ref StarIndex).ToString();

break;

case "PIECE LENGTH":

object PieceLengthNumb = GetKeyNumb(TorrentBytes, ref StarIndex);

if (PieceLengthNumb == null)

{

if (OpenError.Length == 0) OpenError = "PIECE LENGTH 返回不是数字类型";

return false;

}

TorrentPieceLength = long.Parse(PieceLengthNumb.ToString());

break;

case "PIECES":

TorrentPieces = GetKeyByte(TorrentBytes, ref StarIndex);

break;

case "PUBLISHER":

TorrentPublisher = GetKeyText(TorrentBytes, ref StarIndex).ToString();

break;

case "PUBLISHER.UTF-8":

TorrentPublisherUTF8 = GetKeyText(TorrentBytes, ref StarIndex).ToString();

break;

case "PUBLISHER-URL":

TorrentPublisherUrl = GetKeyText(TorrentBytes, ref StarIndex).ToString();

break;

case "PUBLISHER-URL.UTF-8":

TorrentPublisherUrlUTF8 = GetKeyText(TorrentBytes, ref StarIndex).ToString();

break;

case "NODES":

int NodesCount = 0;

ArrayList _NodesList = GetKeyData(TorrentBytes, ref StarIndex, ref NodesCount);

int IPCount= _NodesList.Count/2;

for (int i = 0; i != IPCount; i++)

{

TorrentNotes.Add(_NodesList[i * 2] + ":" + _NodesList[(i * 2) + 1]);

}

break;

default:

return false;

}

return true;

}

#region 获取数据

///

/// 获取列表方式"I1:Xe"="X" 会调用GetKeyText

///

///

///

///

private ArrayList GetKeyData(byte[] TorrentBytes, ref int StarIndex, ref int ListCount)

{

ArrayList _TempList = new ArrayList();

while (true)

{

string TextStar = Encoding.UTF8.GetString(TorrentBytes, StarIndex, 1);

switch (TextStar)

{

case "l":

StarIndex++;

ListCount++;

break;

case "e":

ListCount--;

StarIndex++;

if (ListCount == 0) return _TempList;

break;

case "i":

_TempList.Add(GetKeyNumb(TorrentBytes,ref

StarIndex).ToString());

break;

default:

object ListText = GetKeyText(TorrentBytes, ref StarIndex);

if (ListText != null)

{

_TempList.Add(ListText.ToString());

}

else

{

if (OpenError.Length == 0)

{

OpenError = "错误的Torrent文件,ANNOUNCE-LIST 错误";

return _TempList;

}

}

break;

}

}

}

///

/// 获取字符串

///

///

///

///

private object GetKeyText(byte[] TorrentBytes, ref int StarIndex)

{

int Numb = 0;

int LeftNumb = 0;

for (int i = StarIndex; i != TorrentBytes.Length; i++)

{

if ((char)TorrentBytes[i] == ':') break;

if ((char)TorrentBytes[i] == 'e')

{

LeftNumb++;

continue;

}

Numb++;

}

StarIndex += LeftNumb;

string TextNumb = Encoding.UTF8.GetString(TorrentBytes, StarIndex, Numb);

try

{

int ReadNumb = Int32.Parse(TextNumb);

StarIndex = StarIndex + Numb + 1;

object KeyText = Encoding.UTF8.GetString(TorrentBytes, StarIndex, ReadNumb);

StarIndex += ReadNumb;

return KeyText;

}

catch

{

return null;

}

}

///

/// 获取数字

///

///

///

private object GetKeyNumb(byte[] TorrentBytes, ref int StarIndex)

{

if (Encoding.UTF8.GetString(TorrentBytes, StarIndex, 1) == "i")

{

int Numb = 0;

for (int i = StarIndex; i != TorrentBytes.Length; i++)

{

if ((char)TorrentBytes[i] == 'e') break;

Numb++;

}

StarIndex++;

long RetNumb = 0;

try

{

RetNumb=long.Parse(Encoding.UTF8.GetString(TorrentBytes, StarIndex, Numb-1));

StarIndex += Numb;

return RetNumb;

}

catch

{

return null;

}

}

else

{

return null;

}

}

///

/// 获取BYTE数据

///

///

///

///

private byte[] GetKeyByte(byte[] TorrentBytes, ref int StarIndex)

{

int Numb = 0;

for (int i = StarIndex; i != TorrentBytes.Length; i++)

{

if ((char)TorrentBytes[i] == ':') break;

Numb++;

}

string TextNumb = Encoding.UTF8.GetString(TorrentBytes, StarIndex, Numb);

try

{

int ReadNumb = Int32.Parse(TextNumb);

StarIndex = StarIndex + Numb + 1;

System.IO.MemoryStream KeyMemory = new System.IO.MemoryStream(TorrentBytes, StarIndex, ReadNumb);

byte[] KeyBytes = new byte[ReadNumb];

KeyMemory.Read(KeyBytes, 0, ReadNumb);

KeyMemory.Close();

StarIndex += ReadNumb;

return KeyBytes;

}

catch

{

return null;

}

}

///

/// 对付INFO的结构

///

///

///

///

private void GetFileInfo(byte[] TorrentBytes,ref int StarIndex,ref int ListCount)

{

if ((char)TorrentBytes[StarIndex] != 'd') return;

StarIndex++;

if(GetKeyText(TorrentBytes, ref StarIndex).ToString().ToUpper()=="FILES")

{

TorrentFileInfoClass Info = new TorrentFileInfoClass();

while (true)

{

string TextStar = Encoding.UTF8.GetString(TorrentBytes, StarIndex, 1);

switch (TextStar)

{

case "l":

StarIndex++;

ListCount++;

break;

case "e":

ListCount--;

StarIndex++;

if (ListCount == 1) TorrentFileInfo.Add(Info);

if (ListCount == 0) return;

break;

case "d":

Info = new TorrentFileInfoClass();

ListCount++;

StarIndex++;

break;

default:

object ListText = GetKeyText(TorrentBytes, ref StarIndex);

if (ListText == null) return;

switch (ListText.ToString().ToUpper()) //转换为大写

{

case "ED2K":

Info.De2K = GetKeyText(TorrentBytes, ref StarIndex).ToString();

break;

case "FILEHASH":

Info.FileHash = GetKeyText(TorrentBytes, ref StarIndex).ToString();

break;

case "LENGTH":

Info.Length = Convert.ToInt64(GetKeyNumb(TorrentBytes, ref StarIndex));

break;

case "PA TH":

int PathCount=0;

ArrayList PathList = GetKeyData(TorrentBytes, ref StarIndex, ref PathCount);

string Temp = "";

for (int i = 0; i != PathList.Count; i++)

{

Temp += PathList[i].ToString();

}

Info.Path=Temp;

break;

case "PA TH.UTF-8":

int PathUtf8Count = 0;

ArrayList Pathutf8List = GetKeyData(TorrentBytes, ref StarIndex, ref PathUtf8Count);

string UtfTemp = "";

for (int i = 0; i != Pathutf8List.Count; i++)

{

UtfTemp += Pathutf8List[i].ToString();

}

Info.PathUTF8=UtfTemp;

break;

}

break;

}

}

}

}

#endregion

///

/// 对应结构INFO 多个文件时

///

public class TorrentFileInfoClass

{

private string path = "";

private string pathutf8 = "";

private long length = 0;

private string md5sum = "";

private string de2k = "";

private string filehash = "";

///

/// 文件路径

///

public string Path { get { return path; } set { path = value; } }

///

/// UTF8的名称

///

public string PathUTF8 { get { return pathutf8; } set { pathutf8 = value; } }

///

/// 文件大小

///

public long Length { get { return length; } set { length = value; } }

///

/// MD5验效(可选)

///

public string MD5Sum { get { return md5sum; } set { md5sum = value; } }

///

/// ED2K 未知

///

public string De2K { get { return de2k; } set { de2k = value; } }

///

/// FileHash 未知

///

public string FileHash { get { return filehash; } set { filehash = value; } } }

}

}

相关主题