将字节数组转换为int32

时间:2013-11-05 07:52:08

标签: c# winforms

我有问题通过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);
}

2 个答案:

答案 0 :(得分:7)

假设textBox2中文本的UTF-8表示长度少于4个字节。 BitConverter.ToInt32需要4个字节的数据才能使用。

顺便说一下,目前还不清楚你想要实现的目标 - 但在编码文本上使用BitConverter.ToInt32很少有用。

另外,在编码风格方面:

  • 你正在分配一个新的字节数组,但后来却有效地忽略它
  • 你在实际使用它们之前声明变量,无缘无故。 (理想情况下,在首次使用时声明变量)
  • 您的变量不遵循.NET命名约定,它们将基于camelCased并且理想情况下提供更多的含义指示而不仅仅是类型

因此,即使您的代码 实际上是正确的,也可以更好地编写为:

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并不理想 - 如果我们知道你试图与价值联系的意义,我们可以在变量名中使用它。)

答案 1 :(得分:2)

此错误的原因是BitConverter.ToInt32期望至少包含4个元素的字节数组,但是传递给它Encoding.UTF8.GetBytes(textBox2.Text)的结果,如果用户输入的内容很短,则可以小于4个字节textBox2,例如“123” - 它只有3个字节。 作为场景的解决方法,您应该将字节数组填充至少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);