【轉載】牛人用批處理寫的Base64編解碼程式

來源:互聯網
上載者:User

太牛了!

估計應該沒多少Bug。誰能最佳化它?

 

 :: Base64.cmd Beta -- Base 64 編碼解碼 01/28/2007 By 0401
@echo off
setlocal enabledelayedexpansion
set op=
set Key=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=
set hexstr=0 1 2 3 4 5 6 7 8 9 A B C D E F
set d=0
for %%i in (%hexstr%) do set d!d!=%%i&set/a d+=1
if "%~1"=="" goto :help
if "%~1"=="/?" goto :help
for %%i in (d D e E h H) do (
        if "%~1"=="/%%i" call :arg%%i %*
        if exist "%~1" (
                if exist "%~1/" set error=Sorry,不支援對一個目錄進行 Base 64 編碼。& goto :error
                set op=encode
                set infile=%~sf1
        )
)
if defined error goto :error
if defined op goto :%op%
set error=無效的參數或檔案名稱:%1。& goto :error

:arge
set op=encode
:argd
if not defined op set op=decode
set infile=%~sf2
if not defined infile set error=沒有指定輸入檔案。& exit/b
if not exist "%infile%" set error=找不到指定檔案:%infile%。& exit/b
set outfile=%~f3
goto :eof
:argh
set op=help
goto :eof
:error
echo %error%
exit/b

goto :encode
s 檔案大小
l 檔案加上100H f子命令填充記憶體的長度。
c 只用來計算第一次編碼的時間
k 判斷 c1 c2 c3
w 每行產生幾組4個位元組的編碼字元,預設18
q 判斷等於w時輸出一行編碼字串
n 用來過濾掉重複的位元組
:encode
>nul (chcp 437&graftabl 936)
cls
for %%i in (%infile%) do set s=%%~zi
if %s% equ 0 exit/b
if %s% gtr 65535 set error=編碼失敗,檔案大小上限為 64KB。& goto :error
set/p=編碼初始化中,請稍等。<nul
set of=B64ENC
set/p=<nul>"%~dp0%of%"
set/a l=s+255
call :d2h %l%
set l=%hex%
call :d2h %s%
echo exit|%comspec%/kprompt f cs:100 l %l% 0A$_r cx$_%hex%$_n a.t1$_w$_f cs:100 l %l% 0D$_n b.t1$_w$_q$_|debug>nul
fc/b %infile% a.t1|find ": ">.t1
fc/b %infile% b.t1|find ": ">>.t1
sort .t1>.t2
call :time t1
set n=
set c=0
set k=0
set q=0
set w=18
for /f "tokens=1,2" %%i in (.t2) do (
        if not "!n!"=="%%i" (
                set/a d=0x%%j
                set/a k+=1
                if !k! equ 1 set c1=!d!
                if !k! equ 2 set c2=!d!
                if !k! equ 3 set c3=!d!
                if !k! equ 3 (
                        set/a e1="c1>>2!
                        set/a e2="((c1&3)<<4)|(c2>>4)"
                        set/a e3="((c2&15)<<2)|(c3>>6)"
                        set/a e4="c3&63"
                        call set b64=!b64!%%Key:~!e1!,1%%%%Key:~!e2!,1%%%%Key:~!e3!,1%%%%Key:~!e4!,1%%
                        set/a q+=1
                        if !q! equ !w! (
                                echo !b64!>>"%~dp0%of%"
                                set b64=
                                set q=0
                                if !c! equ 0 (
                                        set/a c+=1
                                        call :time t2
                                        set/a t="s/(w*3)*(t2-t1)/100"
                                        echo 估計剩餘時間 !t! 秒。
                                )
                                set/p=#<nul
                        )
                        set k=0
                )
        )
        set n=%%i
)
if !k! equ 1 (
        set/a e1="c1>>2"
        set/a e2="(c1&3)<<4"
        call set b64=!b64!%%Key:~!e1!,1%%%%Key:~!e2!,1%%==
)
if !k! equ 2 (
        set/a e1="c1>>2"
        set/a e2="((c1&3)<<4)|(c2>>4)"
        set/a e3="((c2&15)<<2)"
        call set b64=!b64!%%Key:~!e1!,1%%%%Key:~!e2!,1%%%%Key:~!e3!,1%%=
)
echo.
if defined b64 echo %b64%>>"%~dp0%of%"
if defined outfile move/y "%~dp0%of%" "%outfile%"
echo 編碼完成。
del a.t1 b.t1 .t1 .t2
::chcp 936>nul
exit/b

goto :decode
k 用來判斷 e1 e2 e3 e4
e e子命令每行寫入的位元組數,預設是24個位元組產生一個debug的e子命令。可自行修改(3<=e<=24)
s1 轉換後的HEX串
m 判斷s1是否包含指定的位元組數
q 每行有(幾個位元組*3)被編碼
cx 表示檔案大小(位元組),每運算一次加3,因為每4個位元組解碼為3個位元組
cs e子命令在cs段地址內的多少位移處寫入
v1 每行位元組數加2(2個位元組既斷行符號與換行)
v2 行數
v3 q的3倍 用來判斷處理第1行所用時間
:decode
>nul (chcp 437&graftabl 936)
cls
set/p=解碼中<nul
set/p=<nul>dbg.src
set/p v1=<%infile%
set/p=%v1%<nul>.t1
for %%i in (.t1) do set/a q=%%~zi/4&set v1=%%~zi+2&del .t1
for %%i in (%infile%) do set/a v2=%%~zi/v1+1
set/a v3="q*3"
call :time t1
set e=24
set k=1
set m=1
set cx=0
set cs=256
for /f %%i in (%infile%) do (
        set str=%%i
        for /l %%j in (1,1,%q%) do (
                if not defined str if %%j lss %q% goto :decend
                for /l %%k in (0,1,3) do (
                        for /l %%l in (0,1,64) do (
                                if "!str:~%%k,1!"=="!Key:~%%l,1!" (
                                        if !k! equ 1 set e1=%%l
                                        if !k! equ 2 set e2=%%l
                                        if !k! equ 3 set e3=%%l
                                        if !k! equ 4 set e4=%%l
                                        set/a k+=1
                                )
                        )
                )
                set/a c1="(e1<<2)|(e2>>4)"
                call :d2h !c1!
                set s1=!s1! !hex!
                set/a c2="((e2&15)<<4)|(e3>>2)"
                call :d2h !c2!
                set s1=!s1! !hex!
                set/a c3="((e3&3)<<6)|e4"
                call :d2h !c3!
                set s1=!s1! !hex!
               
                set k=1
                set/a cx+=3
                set/a m=cx"%%"e
                if !m! equ 0 (
                        if !e4! equ 64 (
                                set/a cx-=1
                                set s1=!s1:~0,-3!
                                if !e3! equ 64 (
                                        set/a cx-=1
                                        set s1=!s1:~0,-3!
                                )
                        )
                        call :d2h !cs!
                        echo e !hex! !s1! >>dbg.src
                        set/a cs+=e
                        set s1=
                )
                set str=!str:~4!
        )
        if !cx! equ %v3% (
                call :time t2
                set/a ts=t2-t1
                set/a t="ts*v2/100"
                echo ,檔案共 !v2! 行,每行用時約 !ts! 毫秒,估計剩餘時間 !t! 秒。
        )
        set/p=#<nul
)
:decend
if defined s1 (
        if %e4% equ 64 (
                set/a cx-=1
                set s1=!s1:~0,-3!
                if %e3% equ 64 (
                        set/a cx-=1
                        set s1=!s1:~0,-3!
                )
        )
        call :d2h %cs%
        echo e !hex! !s1! >>dbg.src
)
call :d2h %cx%
(echo r cx
echo %hex%
echo n b64dec
echo w
echo q) >>dbg.src
echo.
debug<dbg.src>nul
if defined outfile move/y b64dec "%outfile%"
echo 解碼完成。
del dbg.src
::chcp 936>nul
exit/b

:time
for /f "tokens=1-4 delims=:." %%i in ("%time%") do (
        set/a time1="%%i*360000"
        set/a time2="(1%%j-100)*6000"
        set/a time3="(1%%k-100)*100"
        set/a time4="1%%l-100"
)
set/a %~1=time1+time2+time3+time4
exit/b
:d2h
set/a d=%1
set hex=
if %d% equ 0 set hex=00&exit/b
if %d% gtr 255 (set c=4) else (set c=2)
for /l %%i in (1,1,%c%) do (
        set/a td=d"&"15
        set/a d">>="4
        call set hex=%%d!td!%%!hex!
)
exit/b

:help
for /f "tokens=1 delims=:" %%i in ('findstr/n /c:"=help=" "%~f0"') do more +%%i "%~f0">con & goto :eof
Base64 Encode n Decode Beta By 0401
Usage:
Base64 [/e] filename1 [filename2]
       [/d filename1] [filename2]
       [/h]
    /e        Base 64 編碼操作,處理檔案大小上限 64KB
    /d        Base64 解碼操作
    filename1 輸入檔案名稱
    filename2 輸出檔案名
              /e 預設輸出檔案名為 B64ENC
              /d 預設輸出檔案名為 B64DEC
    /h        協助

 

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.