1

haskell に次のコードがあり、それにいくつかの変更を加えたい:

 unwords . map (printf "%02X") $ zipWith (\x y -> -(fromIntegral (ord x)) + y - 2 :: Word8) "Aa123456" [0..]

このコードを実行すると、次のようになります。

"BD 9E CF CF CF CF CF CF"

基本的に、この関数の逆が必要なので、関数は16進値を取得して"BD 9E CF CF CF CF CF CF"返すことができます"Aa123456"

ステートメントを変更する必要があると確信してprintfいますが、16 進値を受け入れるようにスクリプトを変更するにはどうすればよいでしょうか?

4

1 に答える 1

3

@gspr が示唆するように、これを解決する方法は、それを小さな部分に分割することです。

  1. 文字列から各 16 進数を分離します。つまり、 に"BD 9E CF CF CF CF CF CF"変換し["BD", "9E", ...., "CF", "CF"]ます。
  2. 16 進数の文字列を整数に変換します。例: "BD" -> 189
  3. 各整数を適切な文字に変換します (例: 189 -> "A")

1 の場合、words関数が役立つ場合があります。

2 の場合、read "0xBD" == 189. 各 16 進数を の正しい形式に変換する方法を理解する必要がありますread。(文字列から整数に直接変換する変換関数を書くこともできることに注意してください。これはちょっとした練習になるかもしれません。)

3 の場合は、エンコード操作を逆にするだけです。つまり、式i = y - x - 2 (mod 256)(iは 16 進数から変換されたもの、yはリスト内のインデックス、xは文字の値) を書き、 を解きxます。そしてchrは の逆ordです。

于 2012-12-13T12:04:53.093 に答える