2008-11-06 62 views
1

我在读一件设备生成的二进制日志文件。我转换为短期有效的二进制数据?

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

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

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

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

我该如何知道文件是否搞砸了,可以说FF FF的值是在字节数组中的那两个地方?

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

这是FF FF的正常值吗?还是计算机刚刚遇到了一些短的边界并且无效的数据滚动?

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

谢谢
基思

顺便说一句,我也读其他数字数据类型。我会在这里展示他们,只是因为。 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; 
    } 

回答

3

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

+0

干净的东西在二补的。 http://en.wikipedia.org/wiki/Twos_complement – 2008-11-06 16:16:18

1

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

0

FFFF的一个“短”的值是-1,但FFFF的一个“无符号短”的值是65536

在这种情况下,你应该确保,如果你使用的是无符号的短确保你所有的价值观都是正面的。

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) 
} 
+0

会有一个性能增益或损失切换到这种方法?我还必须写入Read(out byte [],offset,length)方法。 谢谢你的建议。 – 2008-11-06 16:12:22

1

我想你会使用System.BitConverter类得到更好的服务。

专门用于短裤的ToInt16方法。

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

+0

机器正在混合它的小端和大端。 – 2008-11-06 16:09:24