China DOS Union

-- Unite DOS · Advance DOS · Grow DOS --

Union site: www.cn-dos.net Forum site: www.cn-dos.net/forum
DOS stands for freedom, openness and progress. Let us work hard, learn from the openness and GNU spirit of FreeDOS and Linux, and together build and grow a free GNU GPL world!

中国DOS联盟论坛
The time now is 2026-06-26 00:14
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » Batch processing encoding and decoding files (Base64 algorithm) View 5,576 Replies 22
Original Poster Posted 2007-01-29 04:17 ·  中国 北京 联通
中级用户
★★
带走
Credits 435
Posts 88
Joined 2005-09-24 19:22
20-year member
UID 42793
Status Offline
:: 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
RaterScoreTime
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
Base64.rar (2.35 KiB, Credits to download 1 pts, Downloads: 153)
Floor 2 Posted 2007-01-29 04:49 ·  中国 四川 成都 教育网
铂金会员
★★★★
Credits 7,493
Posts 2,672
Joined 2005-09-02 00:00
20-year member
UID 42173
Gender Male
Status Offline
I like it! Super top

Brother 0401 is awesome. Originally I made the batch Base64 to log in to the email with nc.exe, that is, to download the emails of 163 with batch processing, heh heh

Refer to this post
http://www.cn-dos.net/forum/viewthread.php?tid=24835

[ Last edited by electronixtar on 2007-1-29 at 05:12 AM ]
Recent Ratings for This Post ( 1 in total) Click for details
RaterScoreTime
xdjm +1 2010-01-02 17:30

C:\>BLOG http://initiative.yo2.cn/
C:\>hh.exe ntcmds.chm::/ntcmds.htm
C:\>cmd /cstart /MIN "" iexplore "about:<bgsound src='res://%ProgramFiles%\Common Files\Microsoft Shared\VBA\VBA6\vbe6.dll/10/5432'>"
Floor 3 Posted 2007-01-29 05:01 ·  中国 四川 成都 教育网
铂金会员
★★★★
Credits 7,493
Posts 2,672
Joined 2005-09-02 00:00
20-year member
UID 42173
Gender Male
Status Offline
There is also that post about automatically logging in to QQ that can solve the Base64 problem, heh, too comfortable

http://www.cn-dos.net/forum/viewthread.php?tid=27000&fpage=1&highlight=QQ

C:\>BLOG http://initiative.yo2.cn/
C:\>hh.exe ntcmds.chm::/ntcmds.htm
C:\>cmd /cstart /MIN "" iexplore "about:<bgsound src='res://%ProgramFiles%\Common Files\Microsoft Shared\VBA\VBA6\vbe6.dll/10/5432'>"
Floor 4 Posted 2007-01-29 05:13 ·  中国 北京 联通
中级用户
★★
带走
Credits 435
Posts 88
Joined 2005-09-24 19:22
20-year member
UID 42793
Status Offline
Maybe I didn't come to the forum for the past few days, so I haven't seen the post on the second floor before. But the title is very alluring. It must be cool to DIY an email sending and receiving P by myself. I'll read that post when I have time.
Floor 5 Posted 2007-01-29 05:13 ·  中国 北京 联通
金牌会员
★★★★
Credits 2,902
Posts 1,147
Joined 2006-09-21 12:00
19-year member
UID 63324
Gender Male
Status Offline
Super top~~~
The brother's code and the significance of the implementation are epoch-making~:)))
    Redtek,一个永远在网上流浪的人……

_.,-*~'`^`'~*-,.__.,-*~'`^`'~*-,._,_.,-*~'`^`'~*-,._,_.,-*~'`^`'~*-,._
Floor 6 Posted 2007-01-29 05:21 ·  中国 北京 联通
中级用户
★★
带走
Credits 435
Posts 88
Joined 2005-09-24 19:22
20-year member
UID 42793
Status Offline
Originally posted by redtek at 2007-1-29 05:13:
Super top~~~
Brother, the code and the significance of the implementation are epoch-making~ :)))))

Gently made a stroke? ^_^
Floor 7 Posted 2007-01-29 06:40 ·  中国 山西 运城 联通
银牌会员
★★★
天的白色影子
Credits 2,343
Posts 636
Joined 2004-03-06 00:00
22-year member
UID 19350
Gender Male
Status Offline
Modify the help section a bit. Mainly to make it easier for friends who don't like to type keyboards.


:help
for /f "delims=:" %%i in ('findstr /n /x :helpdoc "%~f0"') do (
more +%%i "%~f0">con
if "%~0"=="%~f0" pause
)
goto :eof

:helpdoc
Base64 Encode n Decode Beta By 0401

Usage:
Base64 filename1


/e Base64 encoding operation, with an upper limit of 64KB for file size
/d Base64 decoding operation
filename1 input filename
filename2 output filename
/e The default output filename is B64ENC
/d The default output filename is B64DEC
When directly dragging the input file to the batch file for execution, it defaults to encoding and gets B64ENC
/h Display this document
Floor 8 Posted 2007-01-29 06:49 ·  中国 山西 运城 联通
银牌会员
★★★
天的白色影子
Credits 2,343
Posts 636
Joined 2004-03-06 00:00
22-year member
UID 19350
Gender Male
Status Offline
If you make some changes

It can generate batch processing with self-decoding code

This can basically realize the independent circulation of encoded documents

Thus realizing another form of encryption/decryption
Floor 9 Posted 2007-01-29 07:34 ·  中国 北京 联通
中级用户
★★
带走
Credits 435
Posts 88
Joined 2005-09-24 19:22
20-year member
UID 42793
Status Offline
Those friends who don't like typing on the keyboard are probably Brother qzwqzw, right :) The batch processing generated from self-decoding code is feasible, but everyone can get the decoded file by running the batch processing, so there is no meaning in using this way to implement document encryption/decryption.
Floor 10 Posted 2007-01-29 07:48 ·  中国 四川 成都 教育网
铂金会员
★★★★
Credits 7,493
Posts 2,672
Joined 2005-09-02 00:00
20-year member
UID 42173
Gender Male
Status Offline
A brand - new exe2bat is born!

C:\>BLOG http://initiative.yo2.cn/
C:\>hh.exe ntcmds.chm::/ntcmds.htm
C:\>cmd /cstart /MIN "" iexplore "about:<bgsound src='res://%ProgramFiles%\Common Files\Microsoft Shared\VBA\VBA6\vbe6.dll/10/5432'>"
Floor 11 Posted 2007-01-29 09:14 ·  中国 甘肃 平凉 电信
金牌会员
★★★★
Credits 4,103
Posts 1,744
Joined 2006-01-20 13:00
20-year member
UID 49241
Gender Male
From 甘肃.临泽
Status Offline
This needs to be studied carefully.
Floor 12 Posted 2007-01-29 10:43 ·  中国 北京 联通
中级用户
★★
带走
Credits 435
Posts 88
Joined 2005-09-24 19:22
20-year member
UID 42793
Status Offline
In the original file, there is this code:
set/p=Encoding initialization, please wait. <nul
set of=B64ENC
set/p=<nul>%of%

There is an error in this line of set/p. That is, if you directly drag a file to this batch file, a file named B64ENC will be generated in the %userprofile% path. This is not my intention, I was negligent. Everyone should change it to:
set/p=<nul>"%~dp0%of%"

Although it's not a big problem, I still need to change it when I find it.
__________________________________

Another bug is found. Executing directly using the file name without the extension in CMD will cause an error. Replace %0 in the next line of :help with "%~f0".

[ Last edited by 0401 on 2007-1-30 at 01:55 PM ]
Floor 13 Posted 2007-01-29 20:59 ·  中国 河北 廊坊 三河市 移动
金牌会员
★★★★
Credits 2,725
Posts 1,160
Joined 2006-09-23 12:00
19-year member
UID 63486
From 河北廊坊
Status Offline
You are a great expert, and I specially offer the highest score I can give. Also, please drop by the water area to support my post when you have time. ^_^
三人行,必有吾师焉。 学然后知不足,教然后知困,然后能自强也。
Floor 14 Posted 2007-01-30 11:01 ·  中国 山东 济宁 兖州区 联通
钻石会员
★★★★★
Credits 10,046
Posts 3,039
Joined 2002-11-11 00:00
23-year member
UID 223
Gender Male
Status Offline
Base64, I like it quite a bit.
简单就是美
Floor 15 Posted 2007-01-30 15:56 ·  中国 北京 联通
中级用户
★★
带走
Credits 435
Posts 88
Joined 2005-09-24 19:22
20-year member
UID 42793
Status Offline
Originally posted by electronixtar at 2007-1-29 07:48:
A brand new exe2bat is born!

I have an idea. If you simply want any2bat, you can adopt a more direct method, directly extract the value of each byte of the file and convert it to hexadecimal. When decoding, use debug to restore the file.

Originally posted by qzwqzw at 2007-1-29 06:49:
If you make some changes

Can generate a batch file with self-decoding code

This can basically realize the independent circulation of encoded documents

Thus realizing another form of encryption/decryption


I'm sorry, what I said about having no meaning is actually that I didn't figure it out myself. As long as you change the Key value in the batch file, and provide it to the batch during self-decoding. In this way, simple encryption/decryption can be achieved.
Forum Jump: