0

私は持っているパスワードをデコードするWindowsバッチファイルを持っています(何かがどのように機能するかを確認するためだけに、ナーキーなコメントはありません)。

パスワードは問題のないファイルから読み取られますが、パスワード文字の長さが不明な場合に対応する方法がわからないという事実を除いて、問題はありません。

以下は機能しますが、限られた数の文字に対してのみ、未知の (無制限の) サイズのパスワードに対して類似したものをプログラムするにはどうすればよいですか?

なぜ ~0,2 なのか疑問に思っているなら、アルファベットの各文字が 2 つの数値文字セットで表されるためです。たとえば、00 は A を表し、01 は B を表します。これらは、私がしばらく前に作成した別のプログラムでランダムに生成されます。

IF %MYPASSWORD:~0,2% == %AA% msg * first letter is A
IF %MYPASSWORD:~0,2% == %BB% msg * first letter is B
IF %MYPASSWORD:~0,2% == %CC% msg * first letter is C
IF %MYPASSWORD:~0,2% == %DD% msg * first letter is D
IF %MYPASSWORD:~0,2% == %EE% msg * first letter is E
IF %MYPASSWORD:~0,2% == %FF% msg * first letter is F
IF %MYPASSWORD:~0,2% == %GG% msg * first letter is G
IF %MYPASSWORD:~0,2% == %HH% msg * first letter is H
IF %MYPASSWORD:~0,2% == %II% msg * first letter is I
IF %MYPASSWORD:~0,2% == %JJ% msg * first letter is J
IF %MYPASSWORD:~0,2% == %KK% msg * first letter is K
IF %MYPASSWORD:~0,2% == %LL% msg * first letter is L
IF %MYPASSWORD:~0,2% == %MM% msg * first letter is M
IF %MYPASSWORD:~0,2% == %NN% msg * first letter is N
IF %MYPASSWORD:~0,2% == %OO% msg * first letter is O
IF %MYPASSWORD:~0,2% == %PP% msg * first letter is P
IF %MYPASSWORD:~0,2% == %QQ% msg * first letter is Q
IF %MYPASSWORD:~0,2% == %RR% msg * first letter is R
IF %MYPASSWORD:~0,2% == %SS% msg * first letter is S
IF %MYPASSWORD:~0,2% == %TT% msg * first letter is T
IF %MYPASSWORD:~0,2% == %UU% msg * first letter is U
IF %MYPASSWORD:~0,2% == %VV% msg * first letter is V
IF %MYPASSWORD:~0,2% == %WW% msg * first letter is W
IF %MYPASSWORD:~0,2% == %XX% msg * first letter is X
IF %MYPASSWORD:~0,2% == %YY% msg * first letter is Y
IF %MYPASSWORD:~0,2% == %ZZ% msg * first letter is Z

これは最初の文字のみをカバーする良い原因です。たとえば 100 文字の場合、1000 1000 倍以上の場合、上記の 100 回以上を実行する必要があります (申し訳ありませんが、これはループにとって理想的だと考えていますが、常に問題があります)。

つまり、%MYPASSWORD:~998:2% (パスワードに 1000 文字の場合) または %MYPASSWORD:~99998:2% (100 万文字の場合) にループしようとしています。明らかに誰もその量をコード化していません

4

1 に答える 1

1

文字マップ変数の定義を逆にすると、作業がはるかに簡単になります。文字を名前として、コードを値として使用します。名前にコードを使用し、値として文字を使用します。%17%パーサーがパラメーターなどと混同しないように、名前の前に数字以外の文字を付ける必要があり%1ます。

たとえば、 を定義した場合set AA=21、私は次のように定義しますset map21=A

バッチ変数の長さに制限はありません。最大長は 8192 文字です。それを 2 で割ると、ループの最大数が得られます。FOR /L コマンドは高速ループ コンストラクトです。

また、遅延展開を使用することによってもメリットがあります。

上記の推奨事項を採用する場合に必要なものは次のとおりです。

setlocal enableDelayedExpansion
set "decodedPassword="
for /l %%N in (0 2 8191) do (
  for /f "delims=" %%C in ("!MYPASSWORD:~%%n,2!") do (
    set "decodedPassword=!map%%C!"
  )
)

上記のコードはさらに最適化できます。たとえば、最後のコードを処理した後、さらにコードを探し続けるのは時間を無駄にします。しかし、あなたの場合、無駄な時間はおそらく取るに足らないものです。

于 2013-02-20T19:58:57.580 に答える