2008-11-06 56 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