@echo off
::::::::Base64 Encode {s11ss 2007-12-1}::::::::
::思路:
:: 1.用debug的d命令获取字符串的16进制代码
:: a.计算输入的字符串的长度len(一个汉字是两个字节)
:: b.根据len,计算构造临时文件t1,里面存储debug命令d与q
:: c.构造临时文件t2,里面存储字符串,执行debug(参数为t1和t2)生成临时文件t3
:: d.读取t3的内容,获取字符串的16进制代码(分别处理代码最后一行和之前的行)
:: 2.根据base64方案把16进制代码编码(参照http://baike.baidu.com/view/469071.htm)
setlocal
:getstr
echo 请输入要转换的字符串(可以有汉字):
set/p s=
if "%s%" equ "" goto :getstr
set/a len=0,l=0
:addlen
call set "o=%%s:~%len%,1%%"
if not "%o%" equ "" (
set/a len+=1
if "%o%" gtr "Z" set/a l+=1
goto :addlen
)
set/a len+=%l%
::debug应用
set/a end=0x100+%len%-1
call :10to16 %end%
pushd %tmp%
>t1 call echo d100 %%r%end%%%
>>t1 echo q
>t2 echo.%s%
type t1|debug t2>t3
::获取字符串的16进制代码
set/a n=0
set "i=%%a%%b%%c%%d%%e%%f%%g%%h%%i%%j%%k%%l%%m%%n%%o%%p"
for /f "delims=" %%a in ('more t3^|find ":"') do set/a lines+=1
set/a m=1
setlocal enabledelayedexpansion
for /f "tokens=2-17 delims=- " %%a in ('more t3^|find ":"') do (
if !m! equ %lines% goto :lastline
call set "hex=!hex!%i%"
set/a m+=1
)
:lastline
set/a lines-=1
set/a remain=(%len%-16*%lines%)*2
call set remain=%%i:~0,%remain%%%
for /f "tokens=2-17 delims=- " %%a in ('more t3^|find ":"^|more +%n%') do set "hex=%hex%%remain%"
::根据base64方案把16进制代码编码
set "base64=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="
:hex2base64
if not defined hex goto :print
for /l %%a in (1,1,3) do (
set/a "n=2*(%%a-1)"
call set x=%%hex:~!n!,2%%
set "c%%a=0x!x!"
if "!x!" equ "" set c%%a=0
)
set hex=%hex:~6%
set/a ec1=%c1%">>"2
set/a ec2=%c1%"<<"4"|"%c2%">>"4
set/a ec3=%c2%"<<"2"|"%c3%">>"6
set/a ec4=%c3%
for /l %%a in (1,1,4) do set/a ec%%a=!ec%%a!"&"63
if %c2% equ 0 set ec3=64
if %c3% equ 0 set ec4=64
for /l %%a in (1,1,4) do call set "es=%%es%%%%base64:~!ec%%a!,1%%"
goto :hex2base64
:print
echo.
echo.%es%
pause
popd
goto :eof
:10to16
set "h=0123456789ABCDEF"
set/a q=%1
:1c
set/a r=%q%%%16
set/a q=%q%/16
call set r=%%h:~%r%,1%%
call set r%1=%r%%%r%1%%
if not %q% equ 0 goto :1c
本帖最近评分记录
(共 1 条)
点击查看详情
| 评分人 | 分数 | 时间 |
|---|---|---|
| vkill | +4 | 2007-12-02 03:03 |


