2012-03-24 4 views
1

私はファイル形式で作業しています。ファイル形式にはデータのまとまりが含まれています...だから、私が持っているのは、 "チャンク"のListの配列です。これらは、関数を介してクラスにデータを追加するときに追加されます。リスト<byte>とバイト配列をコピーしていますか?

ここでファイルを保存すると、最初にチャンクを挿入する必要があります。今私はこれが意味をなさないかもしれないことを知っていますが、チャンク内のデータ型のデータオフセットを計算する前に、そのチャンク(空白です)を追加する必要があります。私がそうしないと、データのオフセットが狂ってしまいます。空白のチャンクを挿入した後、必要なデータをコピーする新しいbyte []配列を作成し、更新されたバイト配列で挿入した空のチャンクを上書きします。

私が挿入するデータチャンクには他のデータのオフセットが含まれているため、すべてを追加した後にオフセットを作成する必要がある主な理由です。

基本的に私が持っているものは、(のみ簡略化)これです:

public struct SizeIndexPair { 
     public int Size; 
     public int Index; 
    }; 

    public class Chunks { 
     private Dictionary<int, SizeIndexPair> reserved; 
     public List<List<byte> > DataChunks; 

     ... 

     public void Reserve(int ID, int size, int index) { 
      SizeIndexPair sip; 
      sip.Size = size; 
      sip.Index = index; 
      reserved.Add(ID, sip); 
      List<byte> placeHolder = new List<byte>(size); 
      DataChunks.Insert(index, placeHolder); 
     } 

     public void Register(int ID, byte[] data) { 
      SizeIndexPair sip = reserved[ID]; 
      if (sip.Size != data.Length) 
       throw new IndexOutOfRangeException(); 
      for (int i = 0; i < data.Length; i++) { 
       DataChunks[sip.Index][i] = data[i]; 
      } 
     } 
    }; 

(私は、既存のチャンクに余分なデータを追加する必要がある場合がありますので、私はここでバイトのリストを()を使用してんだ)

私は意味があると思う。

このアプローチの問題は、私がメモリを増やしているアレイを倍増させることです。さらに、データをコピーするプロセスでは、特にファイルには大量のデータが含まれているため、アプリの処理速度が低下する可能性があります。

もっと良いアプローチがありますか?

これを簡単に解決したことの1つは、リストを修復することです。配列の予約と登録の代わりに、ポインタを使って配列に直接アクセスすることができます。これを行う方法はありますか?

ありがとうございました。

+0

として、私は基本的に私は「修正」リストので、私はポインタでそれを反復処理できることができるかどうか知りたいあなたの質問 – BrokenGlass

+0

を理解していません。 – Alex

答えて

0

の目標は、あなたがオーバーロードを使用することができ、あなたのList<List<byte>>内のエントリの残りの部分の前にバイトの特定のコレクションを挿入する場合:

DataChunks.Insert(0, prefix); 
0がにコレクション内の要素のインデックスを表し

前に挿入し、prefixは挿入する値です。次いで、得られたバイトストリームを取得する

:あなたはたとえば「CopyToの」

と呼ばれるバイト配列の機能になります

foreach(byte b in DataChunks.SelectMany(c => c)) 
    Console.WriteLine(b); // replace with the method you use to write the `List of Lists of Bytes 
0

は、ここではそのネットワークパケットハンドラからいくつかの古いコードがあります私は数年前に書いた:ある

Public Sub SendData(ByVal Data() As Byte) 
    Try 
     Dim Length As Integer = Data.Length 
     Dim D() As Byte = BitConverter.GetBytes(Data.Length) 
     ReDim Preserve D(D.Length + Data.Length - 1) 
     Data.CopyTo(D, 4) 
     client.BeginSend(D, 0, D.Length, 0, AddressOf sockSendEnd, client) 
    Catch 
     RaiseEvent onError(Err.Description) 
    End Try 
End Sub 
+0

この質問の言語タグはC#ですので、あなたの答えは正しいかもしれませんが、質問には関係ありません。 –

関連する問題