문제

하나의 스트림에서 여러 객체로 일부 데이터를 탈시 해야하는 응용 프로그램이 있습니다.

데이터 배열은 가변 길이가 함께 포장 된 여러 메시지를 나타냅니다. 스트림에 코드를 구분하는 메시지가 없습니다.

우리는 다음과 같은 일을하고 싶습니다.

void Decode(byte[] Data)  
{  
    Object0.ExtractMessage(Data);
    Object1.ExtractMessage(Data);
    Object2.ExtractMessage(Data);
    ...
}  

각 ProcessData 호출은 배열에서 시작해야 할 곳을 알고 있습니다. 이상적으로 우리는 전달하지 않고 이것을 할 것입니다 DataIx 참조.

C ++ 에서이 작업을 수행하려면 포인터를 배열로 전달하면 각 프로세스 데이터 기능이 필요에 따라 증가합니다.

각 객체 클래스는 자체 메시지가 직렬화되는 방법을 알고 있으며 스트림의 다음 메시지의 시작 부분에서 포인터를 반환하기 위해 (C ++)에 의존 할 수 있습니다.

우리가 이것을 할 수있는 내장 메커니즘이 있습니까 (가지 않고 unsafe)? 작동은 고주파 (~ 10kps)이고 매우 가벼운 것입니다. 우리는 또한 배열을 복사하거나 다듬고 싶지 않습니다.

당신의 도움을 주셔서 감사합니다.

도움이 되었습니까?

해결책

배열 인덱스를 통과하고 반환 할 수 없습니까? 그것은 기본적으로 포인터가 어쨌든 고정 메모리 위치에서 오프셋입니다.

다른 팁

글쎄, 이것은 당신이 간단한 스트림을 원하는 것처럼 들립니다 (예 : MemoryStream을 바이트 배열 주변의 래퍼로 사용합니다. stream = new MemoryStream (data)). 바이트 배열을 스트림으로 감싸고 모든 객체가 필요한만큼 스트림에서 많은 것을 읽은 다음 스트림을 다음 항목으로 건네줍니다. 심지어 전체 바이트 어레이를 한 번에로드해야한다는 이점이 있습니다.

그 외에는 C#에서 포인터를 C ++에서 정확히 사용할 수 있습니다 (포인터는 안전하지 않은 키워드가 필요하고 낙담합니다).

또는 데이터와 인덱스 변수를 전달한 다음 인덱스를 증가시킬 수 있습니다 (사실상 포인터를 사용하는 것과 동일하지만 안전하지 않음).

메모리 스트림으로 데이터를 감싸고 스트리어 리더를 ExtractMessage 메소드로 전달하는 것은 어떻습니까?

나는 몇 가지가 떠오른 것 같아요.

배열 오프셋을 유지하는 클래스에서 바이트 []를 감싸서 포인터의 동작을 시뮬레이션 할 수 있습니다. 배열에 액세스 할 때마다 액세서 메소드를 통해 클래스를 통해 액세스 할 수 있습니다. 아마도 다음 바이트를 반환하고 오프셋 변수를 증가 시켰습니다. 클래스 인스턴스는 다른 ExtractMessage 함수 호출 사이에 전달 될 수 있습니다.

C ++/CLI를 사용하는 것은 어떻습니까? 이를 통해 친숙한 C/C ++ 기술을 사용할 수는 있지만 끔찍한 인터 로프없이 C#에서 직접 호출 할 수 있습니다.

물론 끔찍한 안전하지 않은 옵션이있어 바이트 []에 대한 C# 포인터를 얻고 필요한 포인터 산술을 수행합니다.

당신은 a를 만들 수 있습니다 stream 바이트 배열에서.

Stream stream = new MemoryStream(data);

그런 다음 프로세서가 대신 스트림에서 작동 할 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top