0
0

More than 1 year has passed since last update.

Rust文字コード

Last updated at Posted at 2022-06-05

概要

高効率言語Rust 書き方作り方のSection9に関して
シーザー暗号でPythonと比較している割に26足している理由が明記されてなかったので調べてみる

結論が見たい方は最後まで飛ばしてください
試行錯誤した経緯が書かれているだけなので...

コード

本に書いているコードは書けないので簡単に説明

  • Python
該当文字コード = (該当文字コード - 'A'の文字コード + Shift分の数値) % AからZまでの文字数26 + 'A'の文字コード
  • Rust
該当文字コード = (該当文字コード - 'A'の文字コード + Shift分の数値 + 26) % AからZまでの文字数26 + 'A'の文字コード

shiftする数値は3

不明点

何やら最初の括弧内で26を足す記述が増えている
本に記載通りのコードで記載した場合と26の記述だけなしで実行してみる
変換する文字はYOUTUBE

記載通り  : BRXWXEH. => YOUTUBE.
26記述なし: BRXWXEH. => ?OUTUBE.

最初のencryptはうまくいっている
26の記載がなければBからYへうまく変換できない

調査1 Rustの文字コード

Aの文字コード: 65
Zの文字コード: 90

全ての文字からAの文字コードを引き3つshiftした分の文字コードを記載する(code - codeA + shift)

  • 暗号化
Y(89)===> ,   26なし:27,   26あり:53
O(79)===> ,   26なし:17,   26あり:43
U(85)===> ,   26なし:23,   26あり:49
T(84)===> ,   26なし:22,   26あり:48
U(85)===> ,   26なし:23,   26あり:49
B(66)===> ,   26なし:4,    26あり:30
E(69)===> ,   26なし:7,    26あり:33
  • 復号化
B(66)===> ,   26なし:-2,   26あり:24
R(82)===> ,   26なし:14,   26あり:40
X(88)===> ,   26なし:20,   26あり:46
W(87)===> ,   26なし:19,   26あり:45
X(88)===> ,   26なし:20,   26あり:46
E(69)===> ,   26なし:1,    26あり:27
H(72)===> ,   26なし:4,    26あり:30

調査2 Pythonの文字コード

Aの文字コード: 65
Bの文字コード: 90

  • 暗号化
Y(89)===>   26なし27,   26あり53
O(79)===>   26なし17,   26あり43
U(85)===>   26なし23,   26あり49
T(84)===>   26なし22,   26あり48
U(85)===>   26なし23,   26あり49
B(66)===>   26なし4,   26あり30
E(69)===>   26なし7,   26あり33
  • 復号化
B(66)===>   26なし-2,   26あり24
R(82)===>   26なし14,   26あり40
X(88)===>   26なし20,   26あり46
W(87)===>   26なし19,   26あり45
X(88)===>   26なし20,   26あり46
E(69)===>   26なし1,   26あり27
H(72)===>   26なし4,   26あり30

調査3 文字コードから文字へ変換する

  • Rust
    暗号化(26あり)
文字コード66-->B
文字コード82-->R
文字コード88-->X
文字コード87-->W
文字コード88-->X
文字コード69-->E
文字コード72-->H
文字コード46-->.

復号化(26あり)

文字コード89-->Y
文字コード79-->O
文字コード85-->U
文字コード84-->T
文字コード85-->U
文字コード66-->B
文字コード69-->E
文字コード46-->.

暗号化(26なし)

文字コード66-->B
文字コード82-->R
文字コード88-->X
文字コード87-->W
文字コード88-->X
文字コード69-->E
文字コード72-->H
文字コード46-->.

復号化(26なし)

文字コード63-->?
文字コード79-->O
文字コード85-->U
文字コード84-->T
文字コード85-->U
文字コード66-->B
文字コード69-->E
文字コード46-->.
  • Python
    暗号化
文字コード66-->B
文字コード82-->R
文字コード88-->X
文字コード87-->W
文字コード88-->X
文字コード69-->E
文字コード72-->H
文字コード46-->.

復号化

文字コード89-->Y
文字コード79-->O
文字コード85-->U
文字コード84-->T
文字コード85-->U
文字コード66-->B
文字コード69-->E
文字コード46-->.

調査4 Bを入力にした際の復号化の挙動(26なし)

Python

(Bの文字コード66 - Aの文字コード65 + -3(暗号化が3なので復号化は-3)) % 26 + Aの文字コード
=(1 - 3) % 26 + 65
=-2 % 26 + 65
=24 + 65
=89

Rust

(Bの文字コード66 - Aの文字コード65 + -3(暗号化が3なので復号化は-3)) % 26 + Aの文字コード
=(1-3) % 26 + 65
=-2 + 65
=63

結論

PythonとRustでの計算の挙動が異なるため

参考

ソフトウェアエンジニアによるIT技術、数学の備忘録

0
0
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0