2012-03-24 3 views
1

그래서 저는 파일 형식으로 작업하고 있습니다. 파일 형식에는 데이터 덩어리가 들어 있습니다 ... 그래서 내가 가지고있는 것은 "덩어리"에 대한 List의 배열입니다. 그것들은 함수를 통해 클래스에 데이터를 추가 할 때 추가됩니다.리스트 <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]; 
      } 
     } 
    }; 

(I은 기존의 덩어리에 추가 데이터를 추가해야 할 수도 있기 때문에 여기 내가 사용 목록 (바이트))

나는 이해하고 있기를 바란다.

이 접근법의 문제점은 더 많은 메모리를 먹는 배열을 '두 배로'한다는 것입니다. 게다가 데이터를 복사하는 과정은 내 응용 프로그램을 상당히 느려질 수 있습니다. 특히 파일에 일반적으로 많은 양의 데이터가 포함되어 있기 때문입니다.

더 나은 방법이 있습니까?

쉽게 해결할 수있는 한 가지는 List를 수정하고 배열을 예약/등록하는 대신 포인터를 통해 배열에 직접 액세스 할 수 있습니다. 이것을 할 수있는 방법이 있습니까?

도움 주셔서 감사합니다.

+0

으로 나는 기본적으로 내가 '수정'목록 내가 포인터로 반복 할 수 할 수 있는지 알고 싶어 질문 – BrokenGlass

+0

을 이해하지 않습니다. – Alex

답변

0

목표는 List<List<byte>>는 다음 과부하 사용 할 수있는 항목의 나머지 전에 바이트 특정 모음을 삽입하는 경우 : 0가 컬렉션에 요소의 인덱스를 나타냅니다

DataChunks.Insert(0, prefix); 

을 앞에 삽입하고 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#이므로 답변이 정확할 수도 있지만 질문과 관련이 없습니다. –