为了正常的体验网站,请在浏览器设置里面开启Javascript功能!
首页 > 迅雷种子文件——解析Torrent文件

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

2017-09-27 25页 doc 54KB 261阅读

用户头像

is_668482

暂无简介

举报
迅雷种子文件——解析Torrent文件迅雷种子文件——解析Torrent文件 对于这个类在解析Torrent 文件时候可能有错误,请大家指正。先把文件解析的类贴出来,连接有空再发把。 使用 TorrentFile File = new TorrentFile(openFileDialog1.FileName); File.TorrentFileInfoClass[] 文件信息 File.TorrentAnnounceList 服务器列表 全部代码 using System; using System.Collections.Generic; us...
迅雷种子文件——解析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@Sina.com /// 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 (GetValueText(TorrentBytes, ref StarIndex, Keys.ToString().ToUpper()) == false) break; } } #endregion /// /// 读取结构 /// /// /// /// /// private bool GetValueText(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 "CREATION DATE": object Date = GetKeyNumb(TorrentBytes, ref StarIndex).ToString(); if (Date == null) { if (OpenError.Length == 0) OpenError = "CREATION DATE 返回 不是数字类型"; 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 "CREATED 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 "PATH": 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 "PATH.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; } } } } }
/
本文档为【迅雷种子文件——解析Torrent文件】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。 本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。 网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。

历史搜索

    清空历史搜索