2012-03-24 23 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]; 
      } 
     } 
    }; 

(我使用的列表(字節),在這裏,因爲我可能需要額外的數據添加到現有的塊)

我希望我有道理。

這種方法的問題是我'倍增'數組,這是吃了更多的內存。此外,複製數據的過程可能會使我的應用程序變慢,尤其是因爲該文件通常包含大量數據。

有沒有更好的方法呢?

有一件事情可以很容易地解決這個問題,修復列表,而不是預留/註冊數組,我可以直接通過指針直接訪問數組。有沒有辦法做到這一點?

感謝您的幫助。

+0

的是我不明白你的問題 – BrokenGlass 2012-03-24 01:24:19

+0

基本上我想知道如果我能「修復」的列表,以便我可以通過它用一個指針迭代。 – Alex 2012-03-24 01:34:00

回答

0

如果目標是在你的List<List<byte>>那麼你可以使用過載的條目的其餘部分之前插入字節的特定集合:

DataChunks.Insert(0, prefix); 

其中0代表集合中元素的索引之前插入和prefix是插入的值。

然後拿到生成的字節流:

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

你應該看看在名爲「CopyTo從」

例如字節數組功能,這裏是從網絡包處理一些舊代碼,我幾年前寫的:

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#,所以你的答案(儘管可能是正確的)與問題無關。 – 2012-03-24 04:44:03