种子转磁力的方法

来源:互联网 发布:建筑cad软件 编辑:程序博客网 时间:2024/04/27 22:37

上一篇文章是从网上转载的关于bencode的基本知识,有了这些基础,我们就可以通过种子文件进行分析了。具体的种子结构网上有很多相关的资料,这里不多介绍了。

种子文件转磁力的关键是info字段,具体方法就是把info字段取出然后进行sha1算法解码


具体代码:


BOOL aa::parse_torrent( std::string FilePath )
{
long long metafile_size,beg,end,pos;
int push_pop = 0;//用于标记,找到d对应的e
char *metafile_buf = NULL;//保存读文种子文件的缓冲区
long i;
FILE *fp = NULL;
if( FilePath.c_str() == NULL )
{
return -1;
}
fp = fopen(FilePath.c_str(),"rb");//以二进制形式打开
if(fp == NULL){
printf("open file fail %s:%d\n",__FILE__,__LINE__);
return -1;
}
//获取种子文件长度
fseek(fp,0,SEEK_END);//将文件指针移动到文件尾
metafile_size = ftell(fp);
if(metafile_size == -1){
printf("get metafile size fail %s:%d\n",__FILE__,__LINE__);
return -1;
}


#ifdef DEBUG
printf("metafile size = %lld\n",metafile_size);
#endif
fseek(fp,0,SEEK_SET);//将文件指针移动到文件头
metafile_buf = (char*)malloc(metafile_size+1);
if(metafile_buf == NULL){
printf("malloc fail %s:%d \n",__FILE__,__LINE__);
return -1;
}
memset(metafile_buf,0,metafile_size);
for(i = 0;i < metafile_size;i++)
{
metafile_buf[i] = fgetc(fp);
}
metafile_buf[i] = '\0';


pos = -1;
for(i = 0;i < metafile_size;i++)
{
if(memcmp(metafile_buf+i,"4:info",6) == 0){
pos = i;
break;
}
}
if ( pos == -1 )
{
MessageBoxA(0,"解析种子文件错误","提示",0);
return FALSE;
}
pos = pos + 6;
beg = pos;
do{
if(metafile_buf[pos] == 'd'){ //字典开头
push_pop++;
pos++;
}
else if(isdigit(metafile_buf[pos]))
{
int i = 0;
//如果是数字,说明后面跟一个字符串 5:files 跳过:和字符串
while(isdigit(metafile_buf[pos])){
i = i * 10 + (metafile_buf[pos++] - '0');
}
pos++; //pass:
pos += i;
//printf("***%c\n",metafile_buf[pos]);
}
else if(metafile_buf[pos] == 'l') //列表开头
{
push_pop++;
pos++;
}
else if(metafile_buf[pos] == 'i' && isdigit(metafile_buf[pos+1])) //说明是数字
{
push_pop++;
pos++; //pass:i
while(isdigit(metafile_buf[pos])){
//跳过i和e之间的数字
pos++;
}
// printf("***%c\n",metafile_buf[pos]);
// printf("push_pop = %d\n",push_pop);
}
else if(metafile_buf[pos == 'e']){//如果是e push_pop-1
push_pop--;
pos++;
}
}while(push_pop > 0);
end = pos;


Sha1Value info_hash_ = Sha1Value(&metafile_buf[beg],end-beg);
m_szHash = info_hash_.GetReadableString();
//CharUpperA( (LPSTR)m_szHash.c_str() );
return TRUE;
}


注:Sha1Value这个类来源于网络,个人通过开源种子下载工具找到的。

个人微信,多多交流:


0 0
原创粉丝点击