幻想森林

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 6545|回复: 7

[通用编程] 简单的转换ie7缓存的dat文件到wma文件

[复制链接]

136

主题

1751

帖子

548

积分

版主

Rank: 7Rank: 7Rank: 7

积分
548
发表于 2009-1-4 17:27:09 | 显示全部楼层 |阅读模式
以前在XP下用ie6,可以直接从缓存中找到网页上播放的wma文件。而最近换了win2008系统,ie7+wmp11的环境下,会给在线播放的wma文件加一定的保护。具体的流程是,把wma文件添加一定量的dump字节后,更名为dat文件缓存。于是弄了个小工具解决这个问题。编译后,与缓存好的dat文件放于同一目录,运行即可。
  1. import std.stdio:writefln,writef,readln;
  2. import std.file;
  3. import std.c.stdio;
  4. extern(C) int setlocale(int , char*);
  5. static this()
  6. {
  7.     fwide(stdout,1);
  8.     setlocale(0, "china");
  9. }
  10. void d2w(char[] name)
  11. {
  12.     byte[] dat;
  13.     byte[] wma;
  14.     writefln("你要修改的dat文件名:" ~ name);
  15. //读入wma
  16.     dat = cast(byte[])read(name);
  17.     writef("原dat文件的大小为:" );
  18.     writefln( dat.length );
  19.     wma = dat[65536..dat.length];
  20.     writef("改wma文件的大小为:" );
  21.     writefln( wma.length );
  22. //新文件名
  23.     char[] wma_name = name[0 .. name.length-4] ~ ".wma";
  24.     write(wma_name, wma);
  25. }
  26. //停住命令行
  27. void pause()
  28. {
  29.     writefln("按任意键退出...");
  30.     char[] t;
  31.     readln(stdin, t);
  32. }
  33. //判断是不是dat后缀
  34. int check(char[] name)
  35. {
  36.    if(name.length < 5)
  37.    {
  38.         return -1;
  39.     }
  40.     else
  41.     {
  42.         if (name[name.length-4 .. name.length] == ".dat")
  43.         {
  44. //            writefln(name);
  45. //            writefln(name[name.length-4 .. name.length]);
  46.             return 0;
  47.         }
  48.         else
  49.         {
  50.             return -1;
  51.         }
  52.     }
  53. }
  54. //入口
  55. void main(char[][] args)
  56. {
  57.     if (args.length > 2)
  58.     {
  59.         goto End;
  60.     }
  61. //获取目录列表
  62.     char[][] mylist = listdir(getcwd());
  63.     writef("本目录下所有文件的数量为:");
  64.     writefln(mylist.length);
  65. //计数器
  66.     int dc = 0;
  67.     foreach(int i, char[] c; mylist)
  68.     {
  69.         if(!check(c))
  70.         {
  71.   //          writef(c);
  72.   //          writefln("是dat文件");
  73.                 d2w(c);
  74.                 dc++;
  75.         }
  76.         else
  77.         {
  78.             writef(c);
  79.             writefln("忽略");
  80.         }
  81.     }
  82.     writef("被修改的dat文件是:");
  83.     writef(dc);
  84.     writefln("个");
  85. End:
  86.      pause();
  87. }
复制代码
え~え~お!!!
回复

使用道具 举报

0

主题

25

帖子

254

积分

③业余

积分
254
发表于 2009-1-7 04:12:08 | 显示全部楼层
但是……转换不正确。版主自己试过能行么?我是用这个地方的asx来试的:http://lantis-net.com/zettai/001h.asx,对应的缓存文件是zettai_high[1].dat
上面的代码的主要逻辑就是剪掉文件开头的65536个字节然后转存到另一个文件里。请问65536是从什么地方知道的?直接在我找的那个asx缓存得到的dat文件中里找不到WMA的signature,即便是在65536这个位置看也没什么特别的地方。请问版主可以帮忙看看有没有办法转换那个dat文件吗?

我是直接用Ruby来剪掉那65536字节,测试过得到的结果跟顶楼的程序一样。
  1. #!/usr/bin/env ruby
  2. def dat2wma(dat_file)
  3.   if (dat_file =~ /^(.+)\\.dat$/i) && (!File.exist? "#{$1}.wma")
  4.     content = nil
  5.     open dat_file, 'rb' do |input|
  6.       input.pos = 65536
  7.       content = input.read
  8.     end
  9.     open "#{$1}.wma", 'wb' do |output|
  10.       output.write content
  11.     end
  12.   else
  13.     0
  14.   end
  15. end
  16. def convert_folder(dir='.')
  17.   Dir.entries(dir).grep(/\\.dat$/i).inject 0 do |count, file|
  18.     print "Converting #{file}..."
  19.     wma_len = dat2wma "#{dir}/#{file}"
  20.     puts "done, written #{wma_len} bytes."
  21.     count + 1
  22.   end
  23. end
  24. if __FILE__ == $0
  25.   count = convert_folder ARGV[0] || '.'
  26.   puts "Done converting #{count} dat file(s)."
  27. end
复制代码


另外想问一下,为什么连续的writef/writefln调用不用writefln(formatString, args)来代替?感觉清爽很多。而D里的数组切片也可以用$来指定数组末尾而不必用array.length这么麻烦的写法。然后获取文件后缀可以用std.path.getExt(),替换后缀可以用std.path.addExt(),不必自己做数组操作。
回复 支持 反对

使用道具 举报

136

主题

1751

帖子

548

积分

版主

Rank: 7Rank: 7Rank: 7

积分
548
 楼主| 发表于 2009-1-8 14:51:53 | 显示全部楼层
1.65535个字节的这个,就是直接在ie的页面上用wmp11放的那种wma。
我转的是那种常见国内的dj网站上的舞曲(有个亲戚需要),同时开个N的网页后,然后把dat文件找出来转一下就行了。一次就可以搞定N首。
而那个001h.asx实际连接的文件是个asf文件,如此处理应该不行吧。

2.下那个001h.asx,可以试试用一个现成的软件叫HiDownload。这个文件,很长的,等它自己播放完,然后找缓存太麻烦了。

3. 原理一样,ruby的结果和d的结果当然也一样。

4.writefln(formatString, args), 你不说,我都想不起来用格氏化...

5.$是比较后才加入的,忘了用了...

6.path的用法,我是临时查的文档,完全不知道全部用法...

7.我码代码的习惯太恶劣了,要改变,库文档也要多读...
え~え~お!!!
回复 支持 反对

使用道具 举报

0

主题

25

帖子

254

积分

③业余

积分
254
发表于 2009-1-8 18:13:43 | 显示全部楼层
小的在XP下也是用IE7和WMP11,但是WMA缓存的时候还是普通的WMA,能直接找到
原来那个是ASF啊,那小的知道怎么做了~多谢版主大大!

小的写Ruby脚本放出来主要也是想对比下,觉着这种事情还就应该是脚本发挥作用的地方
回复 支持 反对

使用道具 举报

136

主题

1751

帖子

548

积分

版主

Rank: 7Rank: 7Rank: 7

积分
548
 楼主| 发表于 2009-1-8 18:22:49 | 显示全部楼层
所以我一开始就说了,在“win2008系统,ie7+wmp11的环境下”,呵呵~

是啊,用ruby写批量下指定的东西脚本很方便的,有封装的很好的http,ole模块。
え~え~お!!!
回复 支持 反对

使用道具 举报

550

主题

9116

帖子

214748万

积分

超级版主

如同神一般的存在,腿神!拖后腿的神~~

Rank: 8Rank: 8

积分
2147483647
发表于 2009-1-17 16:00:06 | 显示全部楼层
用ruby写批量下指定的东西脚本很方便的,有封装的很好的http,ole模块。

NND。。为什么我就没看过这些。。汗。。。那书我读得太少了
我就是你们的神,庶民们,追随我吧!跟着我一起拖后腿!
回复 支持 反对

使用道具 举报

0

主题

1

帖子

8

积分

①新人

积分
8
发表于 2009-10-13 17:06:13 | 显示全部楼层
版主能不能把编译好的文件上传,我不会编译
回复 支持 反对

使用道具 举报

136

主题

1751

帖子

548

积分

版主

Rank: 7Rank: 7Rank: 7

积分
548
 楼主| 发表于 2009-10-13 20:17:54 | 显示全部楼层
其实,这个程序有问题,不能100%转换出100%正确的wma文件,所以就不提供了。抱歉。
え~え~お!!!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|幻想森林

GMT+8, 2024-4-25 13:25 , Processed in 0.048671 second(s), 20 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表