我转换为Short的二进制数据是否有效

本文关键字:数据 是否 有效 二进制 转换 Short | 更新日期: 2023-09-27 17:48:49

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

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

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

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

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

我怎么知道文件是否被搞砸了,比如说值FF FF在字节数组的这两个位置?

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

这是FF FF的正常值吗?,还是电脑只是碰到了某种短路,然后用无效数据翻车?

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

谢谢,
Keith

BTW,我也在阅读其他数字数据类型。我会带他们来这里只是因为。Read函数是读取字节[]的基本部分。所有其他数据类型的读取都使用基本的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;
    }

我转换为Short的二进制数据是否有效

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

好吧,您似乎已经为单身人士找到了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)
}

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

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

特别是对于空头,ToInt16方法。

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

Yes 0xFFFF对于有符号短指令是-1。

另外,为什么不使用BinaryReader类?

"short"的FFFF值为-1,而"unsigned short"则为65536。

在这种情况下,如果你确定所有的值都是正的,那么你应该确保你使用的是无符号的short。