【问题标题】:Is the binary data I convert to a Short valid?我转换为 Short 的二进制数据是否有效?
【发布时间】:2010-09-21 02:42:20
【问题描述】:

我正在读取一个设备产生的二进制日志文件。

我有一个字节[]中的数据。

如果我需要读取两个字节来创建一个短的,我可以这样做:

short value = (short)(byte[1] << 8);
value += byte[2];

现在我知道该值对于有效数据是正确的。

我怎么知道文件是否被弄乱了,假设值 FF FF 在字节数组中的这两个位置?

当我查看将 FF FF 转换为 short 的结果值时,我得到 -1。

这是 FF FF 的正常值吗?还是计算机刚刚遇到某种短路并用无效数据翻转?

就我而言,所有这些数字都是正数。如果 FF FF 实际上是一个短的 -1,那么我只需要验证我的所有结果都是正数。

谢谢你,
基思

顺便说一句,我也在阅读其他数字数据类型。我会在这里展示它们只是因为。 Read 函数是从 byte[] 读取的基本部分。所有其他数据类型的读取都使用基本的 Read() 函数。

    public byte Read()
    {
        //advance position and then return byte at position 

        byte returnValue;
        if (_CurrentPosition < _count - 1)
        {
            returnValue= _array[_offset + ++_CurrentPosition];
            return returnValue;
        }
        else
            throw new System.IO.EndOfStreamException
                   ("Cannot Read Array, at end of stream."); 
    }


    public float ReadFloat()
    {
        byte[] floatTemp = new byte[4];
        for (int i = 3; i >= 0; i--)
        {
            floatTemp[i] = Read();
        }

        float returnValue = System.BitConverter.ToSingle
            (floatTemp, 0);

        if (float.IsNaN(returnValue))
        {
            throw new Execption("Not a Number");    
        }
        return returnValue;
    }


    public short ReadInt16()
    {
        short returnValue = (short)(Read() << 8);
        returnValue += Read();
        return returnValue;
    }

    public int ReadInt32()
    {
        int returnValue = Read() << 24;
        returnValue += Read() << 16;
        returnValue += Read() << 8;
        returnValue += Read();
        return returnValue;
    }

【问题讨论】:

    标签: c# binary bit-shift


    【解决方案1】:

    0xffff(所有位等于 1)对于有符号短裤是 -1,是的。阅读Two's complement 了解更多详情。您可以切换到更大的数据类型,或者(按照 Grzenio 的建议)只使用无符号类型。

    【讨论】:

    【解决方案2】:

    嗯,你似乎找到了BitConverter 单身人士。现在让我们看看我们是否可以将它用于其他所有事情......

    MemoryStream mem = new MemoryStream(_array);
    
    
    float ReadFloat(Stream str)
    {
       byte[] bytes = str.Read(out bytes, 0, 4);
       return BitConverter.ToSingle(bytes, 0)
    }
    
    public int ReadInt32(Stream str)
    {
       byte[] bytes = str.Read(out bytes, 0, 4);
       return BitConverter.ToInt32(bytes, 0)
    }
    

    【讨论】:

    • 切换到这种方法会有性能增益还是损失?我还必须编写 Read(out byte[], offset, length) 方法。谢谢你的建议。
    【解决方案3】:

    您是否尝试使用 ushort(无符号短)?

    【讨论】:

      【解决方案4】:

      我认为使用System.BitConverter 类会更好。

      专门用于缩短ToInt16 方法。

      你没有在你的问题中提到它,但你也应该确保你知道硬件设备正在写入它的数据的字节序。从你的例子中看起来浮点数是小字节序,但整数是在大端?我怀疑硬件设备会在其二进制数据输出中混合字节序。

      【讨论】:

      • 机器正在混合它的小端和大端。
      • 奇怪!在这种情况下,您仍然可以使用 ToInt16 及其方法,然后交换字节。这会将所有字节交换放在一个函数(或函数族)中。此处将对此进行更详细的讨论:blogs.msdn.com/jeremykuhne/archive/2005/07/21/441247.aspx
      【解决方案5】:

      是的,0xFFFF 是 -1 的有符号短。

      另外,你为什么不使用BinaryReader class

      【讨论】:

        【解决方案6】:

        “short”的 FFFF 值为 -1,但“unsigned short”的 FFFF 值为 65536。

        在这种情况下,如果您确定所有值都是正数,则应确保使用无符号短。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2012-09-14
          • 2021-11-14
          • 1970-01-01
          • 1970-01-01
          • 2011-06-11
          • 2012-10-26
          • 1970-01-01
          相关资源
          最近更新 更多