我用 adrianvdh 编写了批量编码器和解码器,并自定义了一些文本字符串输入,但是解码器不起作用,因为我在里面放了特殊符号。
这是编码器的字符串
@echo off
setlocal ENABLEEXTENSIONS ENABLEDELAYEDEXPANSION
title Encrypt Taro
color 4
:mainmenu
set savefile=on
::set Encrypt=Nothing
(set CHAR[A]=Ἁ) & (set CHAR[B]=Ằ) & (set CHAR[C]=Å) & (set CHAR[D]=Ȧ) & (set CHAR[E]=ᾉ)
(set CHAR[F]=ᾎ) & (set CHAR[G]=Ἇ) & (set CHAR[H]=Ǟ) & (set CHAR[I]=Ặ) & (set CHAR[J]=Ậ)
(set CHAR[K]=Ᾰ) & (set CHAR[L]=Ἄ) & (set CHAR[M]=ᾌ) & (set CHAR[N]=ᾋ) & (set CHAR[O]=ᾊ)
(set CHAR[P]=Ấ) & (set CHAR[Q]=Ἃ) & (set CHAR[R]=Ả) & (set CHAR[S]=Ⱥ) & (set CHAR[T]=Ắ)
(set CHAR[U]=Ά) & (set CHAR[V]=Ȁ) & (set CHAR[W]=Ẫ) & (set CHAR[X]=Ᾱ) & (set CHAR[Y]=Ä)
(set CHAR[Z]=Ḁ) & (set CHAR[1]=1) & (set CHAR[2]=2) & (set CHAR[3]=3) & (set CHAR[4]=4)
(set CHAR[5]=5) & (set CHAR[6]=6) & (set CHAR[7]=7) & (set CHAR[8]=8) & (set CHAR[9]=9)
(set CHAR[0]=) & (set CHAR[.]=.) & (set CHAR[,]=,) & (set CHAR[ ]= )
echo Enter a string to encrypt:
set /p Encrypt=
cls
set Encrypt2=%Encrypt%
set "EncryptOut="
:encrypt2
set char=%Encrypt2:~0,1%
set Encrypt2=%Encrypt2:~1%
set EncryptOut=%EncryptOut%!CHAR[%char%]!
if not "%Encrypt2%"=="" goto encrypt2
echo Input string: %Encrypt%
echo.
echo Output string: %EncryptOut%
set string=%EncryptOut%
set temp_str=%string%
set str_len=0
:lengthloop
if defined temp_str (
set temp_str=%temp_str:~1%
set /A str_len += 1
goto lengthloop )
echo.
echo Output string is %str_len% characters long!
echo.
echo Consider to check the recent "encryptedtaro.txt" if the result are messed up.
if "%savefile%"=="on" echo.%EncryptOut%>>%~d0%~p0encryptedtaro.txt
echo.
pause
cls
goto mainmenu
这是解码器
@echo off
setlocal ENABLEEXTENSIONS ENABLEDELAYEDEXPANSION
title Decrypt Taro
color 4
:mainmenu
set savefile=on
::set Decrypt=Nothing
(set CHAR[Ἁ]=A) & (set CHAR[Ằ]=B) & (set CHAR[Å]=C) & (set CHAR[Ȧ]=D) & (set CHAR[ᾉ]=E)
(set CHAR[ᾎ]=F) & (set CHAR[Ἇ]=G) & (set CHAR[Ǟ]=H) & (set CHAR[Ặ]=I) & (set CHAR[Ậ]=J)
(set CHAR[Ᾰ]=K) & (set CHAR[Ἄ]=L) & (set CHAR[ᾌ]=M) & (set CHAR[ᾋ]=N) & (set CHAR[ᾊ]=O)
(set CHAR[Ấ]=P) & (set CHAR[Ἃ]=Q) & (set CHAR[Ả]=R) & (set CHAR[Ⱥ]=S) & (set CHAR[Ắ]=T)
(set CHAR[Ά]=U) & (set CHAR[Ȁ]=V) & (set CHAR[Ẫ]=W) & (set CHAR[Ᾱ]=X) & (set CHAR[Ä]=Y)
(set CHAR[Ḁ]=Z) & (set CHAR[1]=1) & (set CHAR[2]=2) & (set CHAR[3]=3) & (set CHAR[4]=4)
(set CHAR[5]=5) & (set CHAR[6]=6) & (set CHAR[7]=7) & (set CHAR[8]=8) & (set CHAR[9]=9)
(set CHAR[0]=0) & (set CHAR[.]=.) & (set CHAR[,]=,) & (set CHAR[ ]= )
echo Enter a string to decrypt:
set /p Decrypt=
cls
set Decrypt2=%Decrypt%
set "DecryptOut="
:decrypt2
set char=%Decrypt2:~0,1%
set Decrypt2=%Decrypt2:~1%
set DecryptOut=%DecryptOut%!CHAR[%char%]!
if not "%Decrypt2%"=="" goto decrypt2
echo Input string: %Decrypt%
echo.
echo Output string: %DecryptOut%
set string=%DecryptOut%
set temp_str=%string%
set str_len=0
:lengthloop
if defined temp_str (
set temp_str=%temp_str:~1%
set /A str_len += 1
goto lengthloop )
echo.
echo Output string is %str_len% characters long!
echo.
echo Consider to check the recent "decryptedtaro.txt" if the result are messed up.
if "%savefile%"=="on" echo.%DecryptOut%>>%~d0%~p0decryptedtaro.txt
echo.
pause
cls
goto mainmenu
事实上,我把数字留空了,因为没有必要。测试程序
我需要帮助解决任何字符串问题,使“解码”中的输出字符串不为空。我想象它会显示正确的解密文本,有人可以帮忙吗?或修复批处理代码...
答案1
问题源于 1) CMD 和 2) Windows 所使用的不同编码。
您可以通过创建包含非 ASCII 字符的文件名并使用该dir
命令在 cmd 中列出来轻松重现该现象。
这就提出了一个问题:您是如何创建上述批处理文件的。是在 DOS 编辑器中还是在 Windows 编辑器中?我建议使用 Notepad++(或支持编码的类似编辑器)来验证批处理文件的编码。请注意,在此类编辑器中,您可以切换编码,以便根据所选的代码页将相同的字节序列解释为不同的文本。
在您的编码器生成无法解码的数据时,很可能是因为编码结果无法在cmd代码页中处理。