3

おそらく私の質問はばかげていますが、char値をintに変換して元に戻すのに問題があります。

問題は、Access DB によって取得された char 値を復号化しようとしていることです。

これが私のコードです

char chrVal = 'M';
int intVal = (int)chrVal; // Output 77 'M'
// Now trying to encrypt using XOR
int encIntVal = intVal ^ 203; // Output 134 '†'
// Convert back
char correct = (char)(encIntVal ^ 203); // Output 'M' - CORRECT
char wrong = (char)('†' ^ 203); // Output WRONG value

実際には、暗号化 XOR から得られた int 値を使用すると、正しい結果 ('M') が得られます。代わりに、encrypt XOR (DB にあるもの) からの char の結果を使用すると、間違った結果 (読み取り不能な文字) が得られます。

さまざまなエンコーディングを使用しようとしましたが、どこに問題があるのか​​ わかりません。

なにか提案を?

アップデート

(int)Convert.ToChar(dr["Sex"]) は 134 ではなく 8224 を返すため、おそらく問題は ADO.NET OleDbDataReader にあることがわかりましたが、まだ解決策を見つけることができません。

解決した

文字「†」は、Windows 1252 コード ページにあります。したがって、正しいエンコーディングで byte[] を取得します。

byte[] byteVal = Encoding.GetEncoding(1252).GetBytes(dr["Sex"])
char correct = (char)(byteVal[0] ^ 203); // Output 'M'

ありがとう

4

2 に答える 2

3

「†」文字は、1 つではなく、多くの Unicode 値の先頭文字にすることができます。

「A」が 65 ASCII 値だけでなく任意の値になるフォントを作成するか、すべての文字が「A」であるフォントを作成できます。

あなたの場合のように、「†」はあなたが言うように134になり、Odedが言及したように8224になります。

Give more emphasis on ASCII/Unicode values and not on what that value when converted to character looks like.

于 2012-05-28T13:05:33.680 に答える
1

あなたの問題は、'†'134ではなく8224であることです.(@Odedがこれを最初に言及しました)'\u0086'代わりに134を使用できます.

于 2012-05-28T13:07:28.703 に答える