Board logo

标题: 批处理做Base64编码、解码运算理论原型 [打印本页]

作者: youxi01    时间: 2008-1-18 18:43     标题: 批处理做Base64编码、解码运算理论原型

转载自dos联盟论坛.
  1. ::base64conv.cmd::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  2. @echo off
  3. setlocal enabledelayedexpansion
  4. set code=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=
  5. set /A B1=10,B2=0x7f,B3=255
  6. echo %B1% %B2% %B3%
  7. :: byte-triplet to base64-quadruple 第一次echo要encode的几个ASCII字符
  8. set /A Q1=(%B1% "&" 252) ">>" 2
  9. set /A Q2=((%B1% "&" 3) "<<" 4) + ((%B2% "&" 240) ">>" 4)
  10. set /A Q3=((%B2% "&" 15) "<<" 2) + ((%B3% "&" 192) ">>" 6)
  11. set /A Q4=(%B3% "&" 63)
  12. ::
  13. echo %Q1% %Q2% %Q3% %Q4% 第二次echo已经encode完毕
  14. echo !code:~%Q1%,1! !code:~%Q2%,1! !code:~%Q3%,1! !code:~%Q4%,1!
  15. :: base64-quadruple to  byte-triplet 第三次echo Base64字符流出来了!
  16. :: yes, I know, to work a loop to find the pos in %code% should be here.
  17. set /A B1=(%Q1% "<<" 2) + ((%Q2% "&" 48) ">>" 4)
  18. set /A B2=((%Q2% "&" 15) "<<" 4) + ((%Q3% "&" 60) ">>" 2)
  19. set /A B3=((%Q3% "&" 3) "<<" 6) + %Q4%
  20. ::
  21. echo %B1% %B2% %B3% 第四次echo decode到原来的字符
  22. ::base64conv.cmd::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  23. pause>nul
复制代码

作者: youxi01    时间: 2008-1-18 18:45     标题: 世界顶尖级牛人:Herbert Kleebauer 写的 base64.cmd

本帖最后由 lxzzr 于 2012-3-4 22:38 编辑
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. set infile=a.txt
  4. :: set infile=%1
  5. for %%i in (%infile%) do set outfile=%%~ni.b64
  6. echo --->%outfile%
  7. echo Content-Type: application/octet-stream; name="%infile%">>%outfile%
  8. echo Content-Transfer-Encoding: base64>>%outfile%
  9. echo Content-Disposition: inline; filename="%infile%">>%outfile%
  10. echo.>>%outfile%
  11. set t=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/
  12. for %%i in (%infile%) do set n=%%~zi
  13. if [%n%]==[0] goto :eof
  14. set /p=<nul>_.a
  15. set /p=<nul>_.b
  16. set /p=a<nul>_.a1
  17. set /p=b<nul>_.b1
  18. set m=1
  19. set /a i=-2
  20. :loop
  21. set /a k="%m%&%n%"
  22. if not [%k%]==[0] copy /b _.a + _.a1>nul
  23. if not [%k%]==[0] copy /b _.b + _.b1>nul
  24. set /a k="%i%&%n%"
  25. if [%k%]==[0] goto :exit
  26. type _.a1>>_.a1
  27. type _.b1>>_.b1
  28. set /a m=m*2
  29. set /a i=i*2
  30. goto :loop
  31. :exit
  32. fc /b %infile% _.a|find ":">_.a1
  33. fc /b %infile% _.b|find ":">>_.a1
  34. sort _.a1>_.b1
  35. set n=
  36. set m=0
  37. set k=0
  38. set q=0
  39. for /f "tokens=1,2" %%i in (_.b1) do (
  40.    if not [!n!]==[%%i] (
  41.         set i=%%j
  42.         call :dig !i:~0,1!
  43.         set /a m=!m!*16+!j!
  44.         call :dig !i:~1,1!
  45.         set /a m=m*16+j
  46.         set /a k=k+1
  47.         if !k!==3 (
  48.            set /a p="m>>18"
  49.            call set x=!x!%%t:~!p!,1%%
  50.            set /a p="(m>>12)&63"
  51.            call set x=!x!%%t:~!p!,1%%
  52.            set /a p="(m>>6)&63"
  53.            call set x=!x!%%t:~!p!,1%%
  54.            set /a p="m&63"
  55.            call set x=!x!%%t:~!p!,1%%
  56.            set /a q=q+1
  57.            if [!q!]==[18] (
  58.                            echo !x!>>%outfile%
  59.                            set x=
  60.                            set q=0)
  61.            set m=0
  62.            set k=0))
  63.    set n=%%i)
  64. if [%k%]==[1] (
  65.            set /a p="m>>2"
  66.            call set x=!x!%%t:~!p!,1%%
  67.            set /a p="(m<<4)&63"
  68.            call set x=!x!%%t:~!p!,1%%==)
  69. if [%k%]==[2] (
  70.            set /a p="m>>10"
  71.            call set x=!x!%%t:~!p!,1%%
  72.            set /a p="(m>>4)&63"
  73.            call set x=!x!%%t:~!p!,1%%
  74.            set /a p="(m<<2)&63"
  75.            call set x=!x!%%t:~!p!,1%%=)
  76. if not [%q%]==[0] echo %x%>>%outfile%
  77. echo.>>%outfile%
  78. echo ----->>%outfile%
  79. del _.a
  80. del _.a1
  81. del _.b
  82. del _.b1
  83. goto :eof
  84. :dig
  85. set j=%1
  86. if [%1]==[A] set j=10
  87. if [%1]==[B] set j=11
  88. if [%1]==[C] set j=12
  89. if [%1]==[D] set j=13
  90. if [%1]==[E] set j=14
  91. if [%1]==[F] set j=15
复制代码

作者: BAT1    时间: 2008-11-22 17:18

看不懂啊。
能附上说明或做成教材吗?
作者: feng    时间: 2009-6-19 13:59

是呀,如果带上说明最好了
作者: plp626    时间: 2012-3-2 14:51

本帖最后由 plp626 于 2012-3-2 16:22 编辑

入口参数4个,每3个ascii值为一组,不足的用-1代替;第四个参数为返回值变量名
  1. :ascii2base64 <int> <int> <int> <ret> //code by plp;
  2. setlocal enabledelayedexpansion&Set/a a1=%1,a2=%2,a3=%3
  3. set/a "b1=a1/4,b2=a1%%4<<4|a2/16,b3=(a2%%16<<2|a3/64)-3*(a2>>31),b4=a3%%64"
  4. Set s=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=
  5. Set $=&Set $=!s:~%b1%,1!!s:~%b2%,1!!s:~%b3%,1!!s:~%b4%,1!
  6. endlocal&Set %4=%$%&goto:eof
复制代码

作者: plp626    时间: 2012-3-2 16:08

本帖最后由 plp626 于 2012-3-2 23:17 编辑

ascii 转 base64编码
  1. @ECHO off
  2. :: base64_d.cmd version 1.0
  3. :: ascii文件(字符串) 转 base64编码存储
  4. :: 用法:第一个参数为文件名,或字符串,建议第一个参数用双引号引起来;
  5. ::       若当期路径没有%1文件名, 则%1被当做字符串处理;
  6. :: 程序依赖ascii转hex的外部程序hex.cmd(version 1.1即可),下载地址:
  7. :: http://www.bathome.net/thread-12688-1-1.html
  8. setlocal enabledelayedexpansion
  9. set "str="
  10. for /f "tokens=1-3" %%a in ('hex.cmd "%~1" 3')do (
  11.         if %%b%%c.==. (
  12.                 call:ascii2base64 0x%%a -1 -1 ans
  13.         )else if %%c.==. (
  14.                 call:ascii2base64 0x%%a 0x%%b -1 ans
  15.         )else (
  16.                 call:ascii2base64 0x%%a 0x%%b 0x%%c ans
  17.         )
  18.         set/p=!ans!<nul
  19. )
  20. goto:eof
  21. :ascii2base64 <int> <int> <int> <ret> //code by plp;
  22. setlocal&Set/a a1=%1,a2=%2,a3=%3
  23. set/a "b1=a1/4,b2=a1%%4<<4|a2/16,b3=(a2%%16<<2|a3/64)-3*(a2>>31),b4=a3%%64"
  24. Set s=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=
  25. Set $=&Set $=!s:~%b1%,1!!s:~%b2%,1!!s:~%b3%,1!!s:~%b4%,1!
  26. endlocal&Set %4=%$%&goto:eof
复制代码





欢迎光临 批处理之家 (http://bbs.bathome.net/) Powered by Discuz! 7.2