【问题标题】:Unhandled exception converting to byte未处理的异常转换为字节
【发布时间】:2017-05-21 14:18:01
【问题描述】:

正如标题所示,我收到“'System.FormatException' 类型的未处理异常”样式消息。需要一些帮助找出原因。我正在读取具有我需要解析的十六进制值的文件。我正在读取的值可能类似于“0x12345678”(长度为 4 个字节)。

第一个字节(注意这是小端序)是“BE”,我可以理解为没问题。然后我的问题是尝试获取接下来的三个字节并将其转换为人类可读的 int。 (长话短说,但生成我正在解析的输出的程序采用人类可读的十进制数并将其转换为这个 LE 废话。)

    string parmVal = lineF.Substring((pos + length));  // this is "0x12345678"

    string hexID = parmVal.Substring(2, 2);   // stores '12'

    byte[] testID = new byte[4];
    testID[0] = Convert.ToByte(parmVal.Substring(4, 2));  <----error here
    testID[1] = Convert.ToByte(parmVal.Substring(6, 2));
    testID[2] = Convert.ToByte(parmVal.Substring(8, 2));
    testID[3] = Convert.ToByte(0);

    decimalID = int.Parse(hexID, System.Globalization.NumberStyles.HexNumber);  // stores 18 (0x12)
    testIDNumber = BitConverter.ToInt32(testID,0);  // stores 345678

有趣的是,在代码中,我稍后将这些值输出到一个 CSV 文件,并且我打印出来的值看起来是正确的,即使它抛出了异常。我尝试以与第一个字节相同的方式读取最后 3 个字节,但是当我对其执行 int.Parse() 时,它的字节序会倒退。我希望它转换 0x"785634",它转换 0x"345678"。

【问题讨论】:

  • 这是不可能的。错误不可能存在。你确定 parmVal 的值是 0x12345678 吗?
  • 代码有效。将lineF.Substring((pos + length)) 替换为"0x12345678" 即可正常运行。
  • 这是在要求进行健全性检查。由于“0x12345678”有效,因此不能是 Substring 调用返回的内容。我会进行一个实验:明确检查预期条件(parmVal == "0x12345678"),如果它们不匹配则抛出。我怀疑你的 throw 会被调用。
  • 好的,所以指定基数 16 的答案解决了这个问题。在我失败的具体示例中,实际值为“0xBEEFFEED”,而不是“0x12345678”。我在我的问题中更改了该值,以便更容易地显示“endian-ness”是如何翻转的。事实证明,当我输入“12345678”号码时,我没有遇到问题。

标签: c# int type-conversion byte


【解决方案1】:

尝试在 Convert.ToByte 调用中指定基数。

在你的情况下,它必须是:

testID[0] = Convert.ToByte(parmVal.Substring(4, 2), 16);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-02
    • 1970-01-01
    • 1970-01-01
    • 2011-11-19
    相关资源
    最近更新 更多