5

BitConverter.ToInt32 を介してバイト配列を int32 に変換する際に問題があります。

タイプ 'System.ArgumentException' の未処理の例外が mscorlib.dll で発生しました

追加情報: コピー先配列は、> コレクション内のすべてのアイテムをコピーするには十分な長さではありません。配列のインデックスと長さを確認する

private void textBox2_TextChanged(object sender, EventArgs e)
{
    byte[] StrToByte = new byte[9];
    int IntHexValue;           
    StrToByte = Encoding.UTF8.GetBytes(textBox2.Text);
    textBox4.Text = BitConverter.ToString(StrToByte);
    IntHexValue = BitConverter.ToInt32(StrToByte, 0);
}
4

2 に答える 2

7

おそらく、テキストの UTF-8 表現の長さtextBox2は 4 バイト未満です。BitConverter.ToInt32処理するには 4 バイトのデータが必要です。

ちなみに、何を達成しようとしているのかは明確ではありませんがBitConverter.ToInt32、エンコードされたテキストで使用することはほとんど役に立ちません。

また、コーディングスタイルに関して:

  • 新しいバイト配列を割り当てていますが、効果的に無視しています
  • 理由もなく、変数を実際に使用する前に変数を宣言しています。(理想的には、最初に使用する時点で変数を宣言します)
  • あなたの変数は.NET命名規則に従っていません.キャメルケースであり、理想的には型だけでなく意味のより多くの指標を提供します.

したがって、コード実際に正しい場合でも、次のように記述したほうがよいでしょう。

private void textBox2_TextChanged(object sender, EventArgs e)
{
    byte[] encodedText = Encoding.UTF8.GetBytes(textBox2.Text);
    textBox4.Text = BitConverter.ToString(encodedText);
    int leadingInt32 = BitConverter.ToInt32(encodedText, 0);
    // Presumably use the value here...
}

(私が言うように、あなたが実際に何をしようとしているのかは明確ではありません。それが名前leadingInt32が理想的ではない理由です.値に関連付けようとしている意味を知っていれば、それを変数名で使用できます. )

于 2013-11-05T07:56:50.160 に答える
3

このエラーの理由はBitConverter.ToInt32、少なくとも 4 つの要素のバイト配列が必要ですが、ユーザーが「123」などのEncoding.UTF8.GetBytes(textBox2.Text)短い何かを入力した場合、4 バイト未満になる可能性があるの結果をそれに渡すことです。それはわずか 3 バイトになります。 textBox2. シナリオの回避策として、次のように、バイト配列を少なくとも 4 バイトの長さにパディングする必要があります。

    StrToByte = Encoding.UTF8.GetBytes("123");

    if (StrToByte.Length < 4)
    {
        byte[] temp = new byte[4];
        StrToByte.CopyTo(temp, 0);
        StrToByte = temp;
    }

    IntHexValue = BitConverter.ToInt32(StrToByte, 0);
于 2013-11-05T08:27:33.017 に答える