2016-04-03 22 views
2

私は、未知のサイズのバイト配列を持っており、4バイトごとに整数に変換したい。問題は、このようなものとして、未知の大きさは動作しませんです。残余バイト配列(未知のサイズ)を残してチャンクに分割する

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

Next 

サイズが4によって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

私が言ったように私はすべての4バイトを整数に変換しようとしています。バイト配列から整数を読み込みたいからです。また、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();
temp.AddRange(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()); 
関連する問題