搜索 社区服务 统计排行 帮助
  • 1640阅读
  • 34回复

crc校验和vbb链接生成小工具(08.30更新)

楼层直达
级别: 新手上路
注册时间:
2003-06-08
在线时间:
0小时
发帖:
159
只看该作者 15楼 发表于: 2004-08-25
我写的一个CRC32校验的,想对比下校验时间,VB是不是真的效率很差呢?期待楼主加上校验时间。。
http://popgo.net/bbs/showthread.php?s=&threadid=268801

1M ADSL 上传极限60K 下载极限160K
犬夜叉TV/DVD MOVIE AVI共享中
级别: 工作组
注册时间:
2003-08-26
在线时间:
13小时
发帖:
6600
只看该作者 16楼 发表于: 2004-08-25
引用
最初由 hiei 发布
delphi 就是object pascal语言,你有pascal的代码给我,很容易就能嵌入进去。 tbtb这部分不难的,很快可以写好。
我不想用外挂,全部集合在程序里面比较精简。
这个我知道的……只是不高兴把pascal转向delphi。从1M都不到的pascal转到xxxMB的delphi感觉很不爽:o:o
但是一些基础的函数(例如CRC32()或者MD5()的proto type你要给我……),我手里的几个pascal好像都不带hash库定义函数的……
另外,用delphi写bff2jcd比较麻烦,除非你愿意想我的bff2jcd一样一个字段一个字段地写,而不是整个structure写入。pascal我记得好像不能定义成即时可变长度关联型字符串的吧(就是长度+数据 )……………………
不过好在string格式就是byte+数据的。但是delphi里面string好像用得很少了吧,都跟C兼容用PChar了……再还有如果是int+data格式的就不行了。只能用在byte+data格式上面。怎么写入数据还是一个大问题……

催片请点此处: http://bbs.popgo.org/bbs/read.php?tid=502402&displayMode=1#19103164
级别: 管理员
注册时间:
2002-12-19
在线时间:
244小时
发帖:
16411
只看该作者 17楼 发表于: 2004-08-25
function caculatefilecrc32(filename:string):integer; <===这样的吧
pascal我记得好像不能定义成即时可变长度关联型字符串的吧(就是长度+数据 )…………………… 《=== length(string) 就可以得到字符串长度。
delphi也不大啊,如果我不用那个界面,也就500K左右,用了不到1M,用upx压缩一下,300多K而已,而且不依赖其他dll.
to freeipb :
下一个版本会加入时间显示的,稍后放出,昨天测试过了,时间相差无几,可以认为是一样的。

-=eDtoon=-aru
----------------------------------------------------------------------------------------------
有空来看看我的
个人blog

崇尚猪的生活 ~
多吃多睡少说话~
级别: 工作组
注册时间:
2003-08-26
在线时间:
13小时
发帖:
6600
只看该作者 18楼 发表于: 2004-08-25
引用
最初由 hiei 发布
function caculatefilecrc32(filename:string):integer; <===这样的吧
pascal我记得好像不能定义成即时可变长度关联型字符串的吧(就是长度+数据 )…………………… 《=== length(string) 就可以得到字符串长度。
delphi也不大啊,如果我不用那个界面,也就500K左右,用了不到1M,用upx压缩一下,300多K而已,而且不依赖其他dll.
这个不行。需要能够分段crc或者md5的。
例如md5(data:bin?):string这样的或者crc(data:bin?):string这样的。
当然如果由crc(filename:string, startpos,length:longint):string的也可以-_-
那个我是说定义record结构的时候…………
比如
record
datalen:integer;
data:bin[datalen];
end;
这样的…………
还有你的delphi那么小?是7.0的吗?7.0的话,找个空间传一下,我有空用用看……
pascal完全安装好像都要1M多了……感觉有点不可思议……

催片请点此处: http://bbs.popgo.org/bbs/read.php?tid=502402&displayMode=1#19103164
级别: 管理员
注册时间:
2002-12-19
在线时间:
244小时
发帖:
16411
只看该作者 19楼 发表于: 2004-08-25
function GetFileCrc32(Filename: string): integer;
function AsmGetFileCrc32(Filename: string): integer;
function GetMemoryStreamCrc32(Stream: TMemoryStream): integer;
function AsmGetMemoryStreamCrc32(Stream: TMemoryStream): integer;

嗯,可以用memorystream的。
我说生成的文件。。。
安装后怎么也有三四百M。

-=eDtoon=-aru
----------------------------------------------------------------------------------------------
有空来看看我的
个人blog

崇尚猪的生活 ~
多吃多睡少说话~
级别: 工作组
注册时间:
2003-08-26
在线时间:
13小时
发帖:
6600
只看该作者 20楼 发表于: 2004-08-25
生成的文件8好比的…………
  1. .386
  2. .model flat,stdcall
  3. option casemap:none
  4. include \masm32\include\windows.inc
  5. include \masm32\include\user32.inc
  6. includelib \masm32\lib\user32.lib
  7. include \masm32\include\kernel32.inc
  8. includelib \masm32\lib\kernel32.lib
  9. WinMain proto :DWORD,:DWORD,:DWORD
  10. .DATA
  11. ClassName db "SimpleWinClass",0
  12. AppName db "Our First Window",0
  13. .DATA?
  14. hInstance HINSTANCE ?
  15. .CODE
  16. start:
  17. invoke GetModuleHandle, NULL
  18. mov hInstance,eax
  19. invoke WinMain, hInstance,NULL, SW_SHOWDEFAULT
  20. invoke ExitProcess, eax
  21. WinMain proc hInst:HINSTANCE,hPrevInst:HINSTANCE,CmdShow:DWORD
  22. LOCAL wc:WNDCLASSEX
  23. LOCAL msg:MSG
  24. LOCAL hwnd:HWND
  25. mov wc.cbSize,SIZEOF WNDCLASSEX
  26. mov wc.style, CS_HREDRAW or CS_VREDRAW
  27. mov wc.lpfnWndProc, OFFSET WndProc
  28. mov wc.cbClsExtra,NULL
  29. mov wc.cbWndExtra,NULL
  30. push hInstance
  31. pop wc.hInstance
  32. mov wc.hbrBackground,COLOR_WINDOW+1
  33. mov wc.lpszMenuName,NULL
  34. mov wc.lpszClassName,OFFSET ClassName
  35. invoke LoadIcon,NULL,IDI_APPLICATION
  36. mov wc.hIcon,eax
  37. mov wc.hIconSm,eax
  38. invoke LoadCursor,NULL,IDC_ARROW
  39. mov wc.hCursor,eax
  40. invoke RegisterClassEx, addr wc
  41. invoke CreateWindowEx,NULL,\
  42. ADDR ClassName,\
  43. ADDR AppName,\
  44. WS_OVERLAPPEDWINDOW,\
  45. CW_USEDEFAULT,\
  46. CW_USEDEFAULT,\
  47. CW_USEDEFAULT,\
  48. CW_USEDEFAULT,\
  49. NULL,\
  50. NULL,\
  51. hInst,\
  52. NULL
  53. mov hwnd,eax
  54. invoke ShowWindow, hwnd,CmdShow
  55. invoke UpdateWindow, hwnd
  56. .WHILE TRUE
  57. invoke GetMessage, ADDR msg,NULL,0,0
  58. .BREAK .IF (!eax)
  59. invoke TranslateMessage, ADDR msg
  60. invoke DispatchMessage, ADDR msg
  61. .ENDW
  62. mov eax,msg.wParam
  63. ret
  64. WinMain endp
  65. WndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM
  66. .IF uMsg==WM_DESTROY
  67. invoke PostQuitMessage,NULL
  68. .ELSE
  69. invoke DefWindowProc,hWnd,uMsg,wParam,lParam
  70. ret
  71. .ENDIF
  72. xor eax,eax
  73. ret
  74. WndProc endp
  75. end start
汇编的,编译出来 2.50 KB (2,560 字节)
  1. .386
  2. .model flat,stdcall
  3. option casemap:none
  4. include \masm32\include\windows.inc
  5. ;include \masm32\include\user32.inc
  6. ;includelib \masm32\lib\user32.lib
  7. include \masm32\include\kernel32.inc
  8. includelib \masm32\lib\kernel32.lib
  9. .DATA
  10. ;ClassName db "SimpleWinClass",0
  11. ;AppName db "Our First Window",0
  12. .DATA?
  13. ;hInstance HINSTANCE ?
  14. .CODE
  15. start:
  16. invoke ExitProcess, eax
  17. end start
编译出来 1.50 KB (1,536 字节)
  1. program HelloWorld;
  2. {&PmType PM}
  3. {&Delphi+,H+}
  4. uses
  5. Windows, sysutils;
  6. var
  7. sfont : hfont;
  8. inst: hwnd;
  9. hwind,
  10. hwindedit1,
  11. hwindedit2,
  12. hwindlabel1,
  13. hwindbut1: hwnd;
  14. WClass : Twndclass;
  15. wmsg: tmsg;
  16. sz1,sz2,sz3 : pchar;
  17. i : integer;
  18. procedure process1;
  19. begin
  20. getwindowtext(hwindedit1, sz1, 255);
  21. sz2[0] := #0;
  22. for i := 0 to strlen(sz1) - 1 do
  23. sz2 := strcat(sz2, strpcopy(sz3,inttostr(ord(sz1[i])) + #32));
  24. setwindowtext(hwindedit2, sz2);
  25. end;
  26. Function WinProc(hwin:hwnd; wmsg:dword; wparm:wparam; lparm:lparam) : longint; stdcall; export;
  27. Begin
  28. Result := 0;
  29. Case wmsg of
  30. WM_Command:
  31. case loword(wparm) of
  32. 66 : process1;
  33. end;
  34. WM_destroy:
  35. postquitmessage(0);
  36. WM_keydown:
  37. if wparm = 13 then
  38. process1;
  39. Else
  40. Result := defwindowproc(hwin, wmsg, wparm, lparm);
  41. End;
  42. End;
  43. procedure Setup;
  44. begin
  45. inst := system.hinstance;
  46. // First we need to register a window class
  47. With WClass do
  48. Begin
  49. style := CS_GLOBALCLASS;
  50. lpfnWndProc := @winproc;
  51. cbclsextra:= 0;
  52. cbwndextra:= 0;
  53. hinstance:= inst;
  54. hicon:= 0;
  55. hcursor := 0;
  56. hbrbackground := 1 + color_BTNFACE;
  57. lpszMenuName := nil;
  58. lpszclassname :='ascii_Class'
  59. End;
  60. if registerclass(WClass) = 0 then// register and test class
  61. begin
  62. messagebox(0,'Class registration failed','Error',
  63. mb_iconstop or mb_ok);
  64. halt(0);
  65. end;
  66. hwind := createwindowex(ws_ex_clientedge, 'ascii_Class', 'ASCII 码查询器 1.0 -- Powered by MISL',
  67. ws_overlapped or ws_dlgframe or ws_minimizebox or ws_sysmenu or ws_visible,
  68. cw_usedefault, cw_usedefault, 350, 350,
  69. 0, 0, inst, nil);
  70. if hwind = 0 then
  71. begin
  72. messagebox(0,'Unable To Create Main Window','Error',
  73. mb_iconstop or mb_ok);
  74. halt(0);
  75. end;
  76. hwindlabel1 := createwindowex(0, 'static', '请输入要查询的字符:',
  77. ws_child or ws_visible,
  78. 24, 24, 200, 28,
  79. hwind, 0, inst, nil);
  80. hwindbut1 := createwindowex(0, 'button', '&F.查询',
  81. //ws_child or ws_visible or bs_DefPushButton,
  82. $50010001,
  83. 232, 56, 72, 28,
  84. hwind, 66, inst, nil);
  85. hwindedit1 := createwindowex(ws_ex_clientedge, 'edit', '',
  86. ws_child or ws_visible,
  87. 24, 56, 200, 28,
  88. hwind, 0, inst, nil);
  89. hwindedit2 := createwindowex(ws_ex_clientedge, 'edit', '',
  90. ws_child or ws_visible or es_multiline or es_AutoVScroll or es_ReadOnly,
  91. 24, 88, 200, 150,
  92. hwind, 0, inst, nil);
  93. sendmessage(hwindlabel1, WM_SETFONT, sfont, 0);
  94. sendmessage(hwindedit1, WM_SETFONT, sfont, 0);
  95. sendmessage(hwindedit2, WM_SETFONT, sfont, 0);
  96. sendmessage(hwindbut1, WM_SETFONT, sfont, 0);
  97. showwindow(hwind,sw_shownormal);
  98. updatewindow(hwind);
  99. end;
  100. begin
  101. getmem(sz1, 1024);
  102. getmem(sz2, 3100);
  103. getmem(sz3, 6);
  104. sfont := CreateFont(17,0,0,0,0,0,0,0,DEFAULT_CHARSET,OUT_CHARACTER_PRECIS,
  105. CLIP_CHARACTER_PRECIS,Default_Quality,FF_DONTCARE,'Tahoma');
  106. Setup;
  107. While getmessage(wmsg,0,0,0) do
  108. begin
  109. translatemessage(wmsg);
  110. dispatchmessage(wmsg);
  111. end;
  112. freemem(sz1, 1024);
  113. freemem(sz2, 3100);
  114. freemem(sz3, 6);
  115. halt(wmsg.wparam);
  116. end.
用virtual pascal编译出来是 30.5 KB (31,232 字节)
………………XDXD纯净不带dll的版本哦……

催片请点此处: http://bbs.popgo.org/bbs/read.php?tid=502402&displayMode=1#19103164
级别: 工作组
注册时间:
2003-08-26
在线时间:
13小时
发帖:
6600
只看该作者 21楼 发表于: 2004-08-25
  1. [font=fixedsys]//全局
  2. var
  3. stopfl:boolean;
  4. //生成部分
  5. var
  6. hashcode:string or PChar;
  7. blocksize,filesize:longint;
  8. data:bin?;
  9. begin
  10. stopfl := false; //停止标志,用于中断此进程
  11. TODO: 检测被检查文件是否存在
  12. TODO: 检测被检查文件名+".hashset"是否存在。存在提示是否覆盖或者另存。
  13. blocksize := 取文本框值:分块大小 // 强制分块大小>= 32768字节。太小了不好……
  14. filesize := 取文件大小(infn);
  15. TODO: 打开被检测文件inf
  16. hashcode := ''
  17. while not eof(inf) do begin
  18. read(inf, blocksize个字节的字符 -> data);
  19. hashcode := hashcode + inttohex(GetMemoryStreamCrc32(data)) + #13#10;
  20. TODO: 进度条的显示
  21. if stopfl then begin
  22. close(inf)
  23. 中断
  24. end;
  25. end;
  26. close(inf);
  27. TODO: 将(filesize, #13#10, blocksize, #13#10, hashcode)写入.hashset文件中
  28. //校验文件生成完毕
  29. end;
  30. //
  31. //校验部分
  32. var
  33. hasherr:string or PChar;
  34. errcount:integer;
  35. blocksize,filesize:longint;
  36. data:bin?
  37. begin
  38. stopfl := false;
  39. hasherr := '';
  40. errcount := 0;
  41. TODO: 检查并打开hashset文件(inf2)
  42. TODO: 打开校验目标(inf)
  43. TODO: 读取filesize和blocksize。若filesize不相同,给出提示。
  44. while not eof(inf) do begin
  45. read(inf, 同上
  46. if inttohex(GetMemoryStreamCrc32(data)) = left(readln(inf2),8) then
  47. hasherr := hasherr + "1"
  48. else begin
  49. hasherr := hasherr + "0";
  50. inc(errcount);
  51. end;
  52. TODO: 进度条的显示
  53. if stopfl then begin
  54. close(inf)
  55. close(inf2)
  56. 中断
  57. end;
  58. end;
  59. close(inf);
  60. close(inf2);
  61. if errcount>0 then begin
  62. TODO: 将(fullfilename, #13#10, filesize(hashset里的filesize), #13#10,
  63. blocksize, #13#10, hasherr, #13#10)写入.bff文件中
  64. TODO: 提示用户用工具继续修复
  65. end;
  66. end;
  67. //
  68. //中断部分
  69. begin
  70. stopfl := true;
  71. end;
  72. //[/font]
基本都是框架,慢慢填哈……delphi好像用了数据流来读写文件了,和当年用readln和writeln差别好大啊哈哈……

催片请点此处: http://bbs.popgo.org/bbs/read.php?tid=502402&displayMode=1#19103164
级别: 管理员
注册时间:
2002-12-19
在线时间:
244小时
发帖:
16411
只看该作者 22楼 发表于: 2004-08-25
更新:
加入多语言支持,根据用户显示自动选择简体、繁体或英文。
加入crc计算时间显示。

-=eDtoon=-aru
----------------------------------------------------------------------------------------------
有空来看看我的
个人blog

崇尚猪的生活 ~
多吃多睡少说话~
级别: 骑士
注册时间:
2004-04-11
在线时间:
0小时
发帖:
1127
只看该作者 23楼 发表于: 2004-08-25
ya~~~有多語版本下載了~~~感謝大大了~~~



我用後...發現一個小bug...就是文件支持長度最多只能62個字(英文及數字)

到長度超過62個字元的檔案都不能驗~~
级别: 工作组
注册时间:
2003-03-21
在线时间:
0小时
发帖:
1996
只看该作者 24楼 发表于: 2004-08-25
更新后文件变小是好事.但是是不是偶系统默认字体的关系,字体很难看,没以前的好..


ID:-=eDtoon=-Ya0MinG@Bo0M^2[CHN]
今生性格似白狼
你的性格有如一隻的白狼,想像力豐富,你的人生目標與世俗觀念有很大出入,你亦不
易受人影響,處事獨立性強,頭腦冷靜,變化萬千。此外,你亦喜歡帶領別人做事,你
會提出很多的策略,而又令他們感到很滿意,所以朋友都覺得你很能幹,喜歡依賴別人
的異性
與你最相配了。
级别: 管理员
注册时间:
2002-12-19
在线时间:
244小时
发帖:
16411
只看该作者 25楼 发表于: 2004-08-25
引用
最初由 wowbvbv 发布
ya~~~有多語版本下載了~~~感謝大大了~~~



我用後...發現一個小bug...就是文件支持長度最多只能62個字(英文及數字)

到長度超過62個字元的檔案都不能驗~~

是不是在CRC的相关操作下? 我明天检查一下。
其实,62个字符也不少了。。。。

引用
最初由 YaoMing 发布
更新后文件变小是好事.但是是不是偶系统默认字体的关系,字体很难看,没以前的好..

ft....
原来用的是宋体,9号,加入多语言支持后被迫改了另外一种字体,看来还是要根据语言来指定不同的字体才行。

-=eDtoon=-aru
----------------------------------------------------------------------------------------------
有空来看看我的
个人blog

崇尚猪的生活 ~
多吃多睡少说话~
级别: 骑士
注册时间:
2004-04-11
在线时间:
0小时
发帖:
1127
只看该作者 26楼 发表于: 2004-08-25
引用
最初由 hiei 发布

是不是在CRC的相关操作下? 我明天检查一下。
其实,62个字符也不少了。。。。



阿..........確實也是啦...呵呵....
其實是因為發現有些文件不能校驗...
以為是不是檔名問題~所以try一下字元長度...


後來發現不能校驗的文件...
不是出在字元長度的問題....而是存放的資料夾的問題...
應該又是作業系統語言的問題.....
只要資料夾是用繁體中文命名的....都不行校驗

怕說的不清楚
放張圖給大大看一下~

把資料夾的"星界紋章"去掉就可以校驗



特殊狀況..但把資料夾重新命成123就可以了....
级别: 管理员
注册时间:
2002-12-19
在线时间:
244小时
发帖:
16411
只看该作者 27楼 发表于: 2004-08-26
检查了一下,是因为你的文件名里面的中文字符不属于big5 字符集里面才导致的错误。。。。
换句话说,那几个中文字符是在简体才有的,在big5里面是没有的。
你试试,应该是不能在你的繁体输入法里面打入这几个字的。

字体显示问题修正了,请大家等待下一版本.

PS:不是无法打开以繁体字命名的文件,而是无法打开以简体字命名的文件... 因为big5字符集里面没有对应的字。。。

-=eDtoon=-aru
----------------------------------------------------------------------------------------------
有空来看看我的
个人blog

崇尚猪的生活 ~
多吃多睡少说话~
级别: 精灵王
注册时间:
2004-01-15
在线时间:
0小时
发帖:
3510
只看该作者 28楼 发表于: 2004-08-26
感谢



神奇蜘蛛虾[Edtoon][CHN][TLF]levine
级别: 骑士
注册时间:
2004-04-11
在线时间:
0小时
发帖:
1127
只看该作者 29楼 发表于: 2004-08-27
引用
最初由 hiei 发布
检查了一下,是因为你的文件名里面的中文字符不属于big5 字符集里面才导致的错误。。。。
换句话说,那几个中文字符是在简体才有的,在big5里面是没有的。
你试试,应该是不能在你的繁体输入法里面打入这几个字的。

字体显示问题修正了,请大家等待下一版本.

PS:不是无法打开以繁体字命名的文件,而是无法打开以简体字命名的文件... 因为big5字符集里面没有对应的字。。。



阿....真的耶.....
感謝嚕~~

因為我有灌"unicode補完計畫"
所以簡中日文也能正常顯示....
所以分不出來~呵呵~~~
快速回复

限150 字节
上一个 下一个