5

我在通过 BitConverter.ToInt32 将字节数组转换为 int32 时遇到问题。

mscorlib.dll 中出现“System.ArgumentException”类型的未处理异常

附加信息:目标数组的长度不足以复制 > 集合中的所有项目。检查数组索引和长度

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 回答