:: Base64.cmd Beta -- Base64 Encoding and Decoding 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, directory encoding is not supported. & goto :error
set op=encode
set infile=%~sf1
)
)
if defined error goto :error
if defined op goto :%op%
set error=Invalid parameter or file name: %1. & goto :error
:arge
set op=encode
:argd
if not defined op set op=decode
set infile=%~sf2
if not defined infile set error=No input file specified. & exit/b
if not exist "%infile%" set error=File not found: %infile%. & exit/b
set outfile=%~f3
goto :eof
:argh
set op=help
goto :eof
:error
echo %error%
exit/b
goto :encode
s File size
l File plus 100H f sub-command fills the length of memory.
c Only used to calculate the time of the first encoding
k Judge c1 c2 c3
w How many groups of 4-byte encoded characters are generated per line, default 18
q Judge when equal to w output a line of encoded string
n Used to filter out duplicate bytes
: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=Encoding failed, file size limit is 64KB. & goto :error
set/p=Initializing encoding, please wait.<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 Estimated remaining time !t! seconds.
)
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 Encoding completed.
del a.t1 b.t1 .t1 .t2
::chcp 936>nul
exit/b
goto :decode
k Used to judge e1 e2 e3 e4
e e sub-command writes the number of bytes per line, default 24 bytes to generate a debug e sub-command. Can be modified by yourself (3<=e<=24)
s1 Converted HEX string
m Judge whether s1 contains the specified number of bytes
q (Several bytes * 3) per line are encoded
cx Indicates the file size (bytes), add 3 each time it is calculated, because every 4 bytes are decoded into 3 bytes
cs e sub-command writes at how many offsets in the cs segment address
v1 Number of bytes per line plus 2 (2 bytes are carriage return and line feed)
v2 Number of lines
v3 3 times q Used to judge the time used for the first line
:decode
>nul (chcp 437&graftabl 936)
cls
set/p=Decoding<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 , The file has !v2! lines, each line takes about !ts! milliseconds, estimated remaining time !t! seconds.
)
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 Decoding completed.
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 filename1
/e Base64 encoding operation, file size limit 64KB
/d Base64 decoding operation
filename1 Input file name
filename2 Output file name
/e Default output file name is B64ENC
/d Default output file name is B64DEC
/h Help
Everyone, please help test. If there are no problems, it may not be updated, and the Beta will be removed directly. The efficiency is a bit low, so everyone can make do with it. The encoding adopts the structure of大牛 Herbert Kleebauer.
Regarding the supported files, it can only go up to 64KB. First, the efficiency is too low, and there is no need to support large files. My own computer configuration is not high, and it takes more than 20 seconds to decode a 1KB file. Second, if the file is larger than 64KB, when generating the file with debug, its high address bit is in the BX register. I am too lazy to modify it, so I won't change it anymore. If you really need to encode a large file, first use RAR volume compression. Or you can modify it yourself, of course, don't forget to share it with everyone ^_^
The simplest way to encode a file is to directly drag the file onto this batch file.
Reference: Batch processing to do Base64 encoding operation Theoretical prototype
[ Last edited by 0401 on 2007-1-30 at 01:51 PM ]
Recent Ratings for This Post
( 10 in total)
Click for details
| Rater | Score | Time |
|---|---|---|
| electronixtar | +5 | 2007-01-29 04:50 |
| pengfei | +15 | 2007-01-29 04:51 |
| vkill | +9 | 2007-01-29 09:14 |
| redtek | +15 | 2007-01-29 11:34 |
| ccwan | +15 | 2007-01-29 20:58 |
| xycoordinate | +2 | 2007-03-17 06:50 |
| kcdsw | +4 | 2007-06-13 16:51 |
| 3mcat | +1 | 2010-08-02 19:06 |
| gool123456 | +2 | 2010-08-28 23:20 |
| 89762566 | +1 | 2010-09-27 11:35 |
Attachments
