1

我正在读取由一台设备生成的二进制日志文件。

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

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

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;
    }
4

6 回答 6

3

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

于 2008-11-06T15:37:58.830 回答
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)
}
于 2008-11-06T15:48:49.730 回答
1

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

于 2008-11-06T15:35:39.850 回答
1

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

专门用于缩短 ToInt16方法。

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

于 2008-11-06T15:59:03.563 回答
1

是的 0xFFFF 是 -1 对于有符号的短。

另外,你为什么不使用这个BinaryReader

于 2008-11-06T16:48:04.087 回答
0

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

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

于 2008-11-06T15:37:01.563 回答