2010-01-13 2 views
2

실제로 스트림의 데이터 형식이 uint 형식입니다. System.IO.Stream을 사용하면 바이트 배열로 내용을 읽을 수 있지만 바이트를 읽은 다음 바이트 배열의 길이가 1/4 인 uint 배열로 변환하지 않으려합니다. uint 배열의 메모리에 직접 읽어서 시간을 절약하고 싶습니다.관리되는 스트림을 C#에서 직접 uint 배열로 읽는 방법?

비보안 C++의 경우 매우 간단합니다. 포인터를 uint 배열로 보내면 완료됩니다. 그러나 C#에서는 그렇게 간단하지 않습니다. 나는 다른 uint 배열과 같은 메모리 주소를 가진 바이트 배열을 생성하고 Stream.Read()의 매개 변수로 바이트 배열을 보내서 Stream.Read()가 바이트 배열에 내용을 쓸 때 uint 배열에서도 마찬가지입니다. 그러나 나는 Marshall 클래스를보고이 문제에 대한 해결책을 찾지 못했습니다. 어떤 아이디어?

답변

2

저는 (예, 이것은 사람들이 여분의 5 분 동안 담당자를 얻으려고 게시 한 코드가없는 그러한 게으른 제안 유형 게시물 중 하나입니다) 당신은 C#에서 같은 기술을 사용할 수 있다고 생각합니다. unsafe 키워드 사용 - 포인터를 엉망으로 만들고 메모리에있는 그대로 액세스 할 수 있습니다.

물론 데이터에 따라 더 느린 비효율적 인 방식으로 코드를 작성하는 것이 좋습니다. 안전하지 않은 코드는 실제로 그리 좋지 않습니다. 추가 보안이 필요합니다. & 테스트 시간입니다.

+0

uint 배열의 주소를 사용할 수 있지만 Read() 메서드는 포인터를 허용하지 않습니다. 관리 바이트 배열 만 허용합니다. 그리고 포인터를 사용하여 바이트 배열의 메모리를 uint 배열의 메모리에 복사 할 수 있지만이 배열은 uint 배열을 직접 읽지 않습니다. 여기서 중요한 것은 시간입니다. – neuron

+0

항상 관리되지 않는 C++로 구현을 작성한 다음 P/Invoking을 통해 C# 결과를 가져 오는 옵션이 있습니다. –

+0

관심없는 분 : 저흰 뭐지? 데이터 세트의 크기는 어느 정도입니까? 알고리즘은 얼마나 자주 호출됩니까? 그것은 대화식이어야합니까, 아니면 서버 어딘가에있는 직업입니까? –

3
List<UInt32> array = new List<UInt32>(); 
System.IO.BinaryReader reader = new System.IO.BinaryReader(stream); 
while(stream.Position < stream.Length) 
    array.Add(reader.ReadUInt32()); 

일부 스트림 구현은 위치 및/또는 길이 속성을 지원하지 않습니다.

+0

일반적으로 정확하지만 OQ에서 길이는 미리 알고 있습니다. –

+0

직접적인 해결책을 찾지 못했다면 이것이 나의 최후의 수단이 될 것입니다. – neuron

관련 문제