2016-04-03 98 views
2

我有一個未知大小的字節數組,我想將每四個字節轉換爲一個整數。問題是未知大小類似這樣的東西是行不通的:將剩餘分割字節數組(未知大小)分塊成

Private Sub(ByVal list() as Byte) 
For i = 0 To list.Count - 1 Step 4 

Next 

至於如果大小不是divideable 4,這將導致異常。 那麼如何將字節數組分成四個字節的塊?

這是我目前的嘗試,但它會導致異常。

Public Function MakeByteChunks(ByVal pByte() As Byte, ByVal pSize As Integer) As List(Of Byte()) 
    Dim chunkList As New List(Of Byte()) 
    For i = 0 To pByte.Count - 1 
     Dim tmpchunkList(pSize) As Byte 
     Array.Copy(pByte, i, tmpchunkList, 0, pSize) 
     chunkList.Add(tmpchunkList) 
    Next 
    Return chunkList 
End Function 

當我試圖將其轉換爲整數:

Dim splittedArray = MakeByteChunks(list, 1) 
     For i = 0 To splittedArray.Count - 1 

Dim Value = BitConverter.ToInt32(splittedArray(i), 0)})    
     Next 
+1

這取決於你在循環中做什麼。您現在向我們展示的代碼似乎非常安全。 – derpirscher

+0

正如我所說,我試圖將每四個字節轉換爲一個整數。這是因爲我想從字節數組中讀取整數。 BitConverter.ToInt32只將偏移量作爲參數。 – Baldik

+0

然後顯示你怎麼做 – derpirscher

回答

1

如果問題是最後一塊可以比4短只是做這樣

Private Sub(ByVal list() as Byte) 
For i = 0 To (list.Count - 3) - 1 Step 4 

Next 
0

轉換字節數組使用ToList方法列表並使用(bytes.Count()+ bytes.Count()mod 4)添加更多項目。 示例:
var bytes = Enumerable.Repeat(1,14).Select(b =>(Byte)b).ToArray();
var temp = bytes.ToList(); (Enumerable.Repeat((byte)0,bytes.Count()%4).ToArray());

或簡單地創建一個整數方法(使用數組提到獲得數組的長度),並使用Buffer.BlockCopy輕鬆複製項目:

var temp2 = new int[(bytes.Length + bytes.Length % 4)/4]; 
      Buffer.BlockCopy(temp2, 0, bytes, 0, bytes.Count());