【问题标题】:Convert byte array to int32将字节数组转换为 int32
【发布时间】:2013-11-05 07:52:08
【问题描述】:

我在通过 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);
}

【问题讨论】:

  • 你为什么要分配一个 9 字节的数组,然后忽略它? (您正在为StrToByte 分配一个新值。)textBox2.Text 的内容是什么?完全不清楚您要在这里实现什么。
  • textBox2.Text 的值是多少?
  • @SonerGönül,为什么?您在寻找另一个 shell 命令吗? :)
  • BitConverter 应用于 UTF-8 数据....?只是:为什么?你想达到什么目的?因为除非要求真的很奇怪,否则这不是一种有效的方法......
  • @gdoron 是的!转到run并输入BitConverter.Encoding.UTF8.GetBytes(textBox2.Text) -quickly,一切准备就绪:)

标签: c# winforms


【解决方案1】:

textBox2 中文本的 UTF-8 表示大概少于 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 这个名字并不理想 - 如果我们知道你试图与价值相关联的含义,我们可以使用在变量名中。)

【讨论】:

  • 我尝试将字节转换为 int(如 0x31、0x32、0x33 为整数 0x7B(1 是 0x31,2 是 0x32,3 是 0x33,123 是 0x7B))
  • @user2955372:但是这里的文字是什么?您是否首先阅读了BitConverter.ToInt32 的文档?
  • @gdoron:添加了各种风格注释。
  • textBox2.Text 值内容您可以通过文本框打印的任何文本。
  • @user2955372:但是你认为这个值意味着是什么?如果用 UTF-8 编码时小于四个字节,你想发生什么?
【解决方案2】:

此错误的原因是 BitConverter.ToInt32 需要至少 4 个元素的字节数组,但您将 Encoding.UTF8.GetBytes(textBox2.Text) 的结果传递给它,如果用户在您的 textBox2 中键入简短的内容,则该结果可能小于 4 个字节,例如“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);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-05-04
    • 2015-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-08
    • 1970-01-01
    相关资源
    最近更新 更多