1

社内アプリを .Net 3.5 から 4 に更新したばかりで、文字列のエンコーディングに問題があります。レジストリに追加する文字列があります。これは (バイト配列として) 暗号化され、エンコーディング windows-1252 を使用して文字列に変換されます。

レジストリから引き出したら、長さをテストします。VB.net 3.5.Lengthを使用すると 23 になります。.Net 4 を使用すると 35 になります。.Net 4 バージョンはより長くなりますが、最後に余分な null 文字があります。これは、復号化プロセスの仕組みに影響を与えます。デフォルトのテキストエンコーディングなどに何か変更がありましたか?

.Net4 は以下です。.Net 3.5 バージョンは同じように出力されますが、0 のパディングはありません

(0): 13
(1): 49
(2): 27
(3): 42
(4): 102
(5): 77
(6): 178
(7): 197
(8): 98
(9): 198
(10): 240
(11): 79
(12): 171
(13): 216
(14): 82
(15): 55
(16): 24
(17): 134
(18): 117
(19): 97
(20): 223
(21): 69
(22): 149
(23): 0
(24): 0
(25): 0
(26): 0
(27): 0
(28): 0
(29): 0
(30): 0
(31): 0
(32): 0
(33): 0

編集:

したがって、レジストリへの入力にはパディングがあります。レジストリから取得すると、異なる文字列になるようです。

私はRegからそれを取得するためにこれを使用しています:

Dim regKey As Microsoft.Win32.RegistryKey
regKey = Microsoft.Win32.Registry.LocalMachine.OpenSubKey(//Location, False)
val = poKey.GetValue(name)

したがって、私の最も簡単な解決策は、文字列を追加するときにパディングを取り除くことですが、なぜ違うのかについて何か考えはありますか?

4

1 に答える 1

1

Encoding クラスを使用して、ランダムなバイナリ データを含む byte[] を文字列に変換することは、根本的に間違っています。これは損失を伴う変換です。レジストリが 8 ビットでエンコードされた文字列を有効な utf-16 文字列として解釈しようとすることで、さらに悪化する可能性があります。結果はまったく予測できません。

任意のバイナリ データを処理できるエンコーディングを使用する必要があります。Convert.ToBase64String() と同様です。

または、より生産的には、文字列ではなくバイナリ データとしてレジストリに格納することで、変換がまったく必要なくなります。RegistryValueKindを受け取る RegistryKey.SetValue() オーバーロードに注意してください。RegistryValueKind.Binary オプションに関心があります。そのオーバーロードを実際に使用する必要はありません。byte[] を直接渡すだけで、変換をまったく試みません。

于 2013-06-06T10:31:56.120 に答える