0

私は簡単な問題だと思うものを持っています。何らかの理由で、次のコードは「文字列は正確に 1 文字の長さでなければなりません」という例外を生成します。

int n = 0;
foreach (char letter in charMsg)
{
    // Get the integral value of the character.
    int value = Convert.ToInt32(letter);
    // Convert the decimal value to a hexadecimal value in string form.
    string hexOutput = String.Format("{0:X}", value);
    //Console.WriteLine("Hexadecimal value of {0} is {1}", letter, hexOutput);
    charMsg[n] = Convert.ToChar(hexOutput);
    n++;
}

行で例外が発生しcharMsg[n] = Convert.ToChar(hexOutput);ます。なぜそれが起こるのですか?値を確認するとCharMsg、それらすべてが適切に含まれているように見えますが、それでもエラーがスローされます。

更新:私はこの問題を解決しました。それは私の間違いでした。お邪魔になってすみません。

わかりました、これは私の側の本当にばかげた間違いでした。ポイントは、私の問題では、16進値が明らかに私を助けないので、これを行うことさえ想定されていないということです。

画像内のメッセージを暗号化するために私がやろうとしていること。最初のピクセルの各カラーチャネルの最後の桁で、メッセージの長さを既に暗号化しています。今、私はまさにそこにメッセージを入れようとしています。私はここを見ました:http://en.wikipedia.org/wiki/ASCIIそして、ヘックスを使用するのが良い考えだとは思わずに自分自身に言いました。そう思ったなんて信じられない。

4

4 に答える 4

3

0x0000印刷可能な Unicode 文字は からまでの範囲のどこにでもある可能性があるため0xFFFF、hexOutput 変数は複数の文字を保持できます。これがエラーがスローされる理由です。 Convert.ToChar(string)常に文字列の長さ a をチェックし、1 に等しくない場合はスローします。したがって、文字列0x30を 16 進数に変換してから、ASCII 表現である symbol に変換することはありません0

アーカイブしようとしているものについて詳しく説明できますか?

于 2013-04-24T21:42:35.623 に答える
3

Convert.ToChar( string s )ドキュメントごとに単一の文字列が必要です。それ以外の場合は、FormatException指摘したように a をスローします。これは、より限定的ではありますが、大まかに次のものに相当します

public char string2char( string s ) { return s[0] ; }

コードは次のことを行います。

  • 文字の列挙可能なコレクション内のすべての文字を反復処理します。
  • そのようなキャラクターごとに、それは...
    • char を int に変換します。ヒント: acharは整数型です: 符号なしの 16 ビット整数値です。
    • その値を、問題の文字の 16 進表現を含む文字列に変換します。ほとんどの文字の場合、文字列の長さは少なくとも 2 文字になります。たとえば、空白文字 (' ', 0x20) をこのように変換すると、文字列 "20" が得られます。
    • 次に、それを char に変換して、反復されている現在のアイテムを置き換えようとします。これは、例外がスローされる場所です。ここで注意すべきことの 1 つは、列挙されているコレクションを変更すると、列挙子が例外をスローする可能性があるということです。

ここで何を達成しようとしているのか。たとえばcharMsg、「a」、「b」、「c」の 3 文字で構成される a が与えられた場合、どうなるでしょうか。明確な問題の説明は、私たちがあなたを助けるのに役立ちます.

于 2013-04-24T21:55:19.650 に答える
1

あなたの hexOutput は文字列であり、charMsg は文字配列であると想定しています。charMsg の最初の要素が 'p'、または 16 進値 70 であるとします。Convert.ToChar(string) のドキュメントには、文字列の最初の文字 ('7') だけを使用すると書かれていますが、それは誤りです。このエラーがスローされます。のような静的な例でこれをテストできますcharMsg[n] = Convert.ToChar("70");。同じエラーが発生します。

文字を 16 進値に置き換えようとしていますか? その場合は、配列割り当ての代わりに StringBuilder オブジェクトを使用してみてください。

于 2013-04-24T21:52:21.323 に答える