11

最近C#で遊んでみましたが、次のコードがコンパイルされない理由を理解しようとしています。エラーコメントのある行で、次のようになります。

タイプ'int'を'char'に暗黙的に変換することはできません。明示的な変換が終了します(キャストがありませんか?)

2つの文字列を使用して単純なXOR演算を実行しようとしています。

public string calcXor (string a, string b)
{
    char[] charAArray = a.ToCharArray();
    char[] charBArray = b.ToCharArray();
    char[] result = new char[6];
    int len = 0;

    // Set length to be the length of the shorter string
    if (a.Length > b.Length)
        len = b.Length - 1;
    else
        len = a.Length - 1;

    for (int i = 0; i < len; i++) {
        result[i] = charAArray[i] ^ charBArray[i]; // Error here
    }

    return new string (result);
}
4

3 に答える 3

21

XOR-ingを使用してデータを非表示にする場合は、以下のコードを参照してください。キーは必要な限り繰り返されます。それはおそらくより短い/より良いアプローチです:

public static string xorIt(string key, string input)
{
    StringBuilder sb = new StringBuilder();
    for(int i=0; i < input.Length; i++)
        sb.Append((char)(input[i] ^ key[(i % key.Length)]));
    String result = sb.ToString ();

    return result;
}
于 2013-10-10T14:03:08.930 に答える
6

xorあなたは2人のキャラクターをやっています。intデータの損失がないため、これにより暗黙的な型変換が行われます。intただし、からに戻すcharには、明示的なキャストを提供する必要があります。

あなたは明示的にあなたintcharforに変換する必要がありますresult[i]

result[i] = (char) (charAArray[i] ^ charBArray[i]);
于 2013-02-20T03:44:05.730 に答える
0

結果の値が重要である場合、Allanは正しいです(受け入れられた答え)。一致するものを探しているだけで、パフォーマンスを気にしない場合は、代わりにstrcmp()またはmemcmp()を使用してください。

アセンブラでは、Tサイクルが少ないため、XORによってそれら自体に対して初期化するのが一般的です。私がブルートフォース(ハッシュ比較)を行っていた場合、これはstrcmpまたはmemcmpよりも改善されます。これは、実際には順序を並べ替えず、一致/不一致だけであるためです。

読者は、微調整できるこれにも注意する必要があります。

于 2014-11-26T00:59:00.373 に答える