2009-12-16 5 views
7

바이트 배열에서 double 형의 관리되는 배열을 만들려고합니다. 현재 문제가 있지만 최적화하고 싶습니다. 다음은 작업하고 싶은 코드입니다.포인터에서 관리되는 배열 만들기

private unsafe static double[] _Get_Doubles(byte[] _raw_data) 
{ 
    double[] ret; 
    fixed (byte* _pd = _raw_data) 
    { 
     double* _pret = (double*)_pd; 
     ret = (double[])*_pret; //FAILURE 
    } 
} 

이러한 문제에 대처하는 방법을 알려주십시오.

-Aaron

당신이 게시 한 코드에 대해 알 수있는 주요 사항의
+0

Interop를 다루는 Marshaller에 당신입니다 친구, System.Runtime.InteropServices.Marshal에서 서비스하십시오. 배열을 사용하기 위해 특별히 필요한 것은 무엇인지 모르겠다. 그러나 포인터 산술을 사용하여 배열에 액세스 할 수 있습니다. 아마 이것은 당신을 올바른 방향으로 암시합니다. – OregonGhost

+0

@daGhost - 포인터를 사용하여 배열에 액세스하는 방법을 알고 있지만 관리되는 배열을 마샬링해야합니다. 감사. –

+0

@Limited Thing (다시 daGhost라고하지 마십시오.) : 포인터로 배열 요소에 액세스 할 수있는 경우 값을 관리 배열에 복사 할 수 있습니다. – OregonGhost

답변

2

지금은 stackalloc이 올바른 방법 일 것이라고 생각했지만 실패했습니다. 가장 중요한 것은, 나는 이제 그것이 실패 할 운명이라는 것을 알고 있습니다. 내가하고 싶은 일을 할 수있는 방법이 없습니다.

는 질문을 재 작성 볼 수 있습니다 :

어떻게이 '안전하지 않은'배열 주위에 관리되는 배열을 만들 수 있습니까?

관리되는 배열은 헤더 정보를 가지고 있으므로 (메모리 척 주위의 클래스이기 때문에) 배열 자체보다 메모리에 더 많은 공간이 필요합니다. 따라서 대답은 다음과 같습니다.

관리되는 배열이 메모리에 저장되는 방식에 따라 (관리되는 배열의 방식에 따라?) 배열 자체를 공간에 할당하고 관리되는 정보 (길이 등)를 '안전하지 않은 배열.

배열 주위에 충분한 데이터가 있기 때문에 불안정합니다. 이것은 쉽게 가능하지 않습니다. 관리되는 바이트 []가 배열 주위에 데이터가 있다는 의미로 전달 되었기 때문에 특정 데이터에서 충분한 공간이있을 수 있지만 동일한 데이터가 관리되는 double []에 적절하다는 것을 주장하는 것이 가장 바람직하지 않지만 대부분 데이터를 변경하여 관리되는 이중 []에 적합하도록하는 것은 나쁜 일입니다.

[편집] 그것은 Marshal.Copy처럼 보이는

여기에 갈 수있는 방법입니다. 새로운 배열을 만들고하자 원수가 그들을 (그가 나보다 빠를 것, 또는 아마도 일부 나중에, 그는 빨리 될 것으로 기대하고) 복사 : 일반적으로

var ret = new double[_raw_data.Length/sizeof(double)]; 
System.Runtime.InteropServices.Marshal.Copy(new System.IntPtr(_pret), ret, 0, ret.Length); 
3

하나가 반환 값에 의해 지적 얼마나 많은 항목을 알 수있는 방법이 없으며, 관리 배열하는 방법을 알 필요가 있다는 것입니다 큰 것입니다. double*을 반환하거나 new double[XXX]을 생성하고 값을 복사하거나 심지어 카운트가 상수 인 경우 멤버가있는 struct을 생성하고 원시 데이터를 해당 유형으로 캐스팅 할 수 있습니다.

+0

그건 기본적으로 내가하는 일이다. 고정 길이의 double 배열을 만든 다음 한 번에 하나씩 내 값을 복사했습니다. C++ 방식으로 새로운 double 배열을 할당하지 않는 것이 좋습니다. 예, double []과 byte []가 al, ax, eax 레지스터처럼 겹치도록 설정된 구조체입니다.하지만 구조체를 만드는 오버 헤드는 내가하는 일보다 더 많은 것일 수 있습니다. 생각해 보면 왜 지구상에서 배열에 너무 복잡하게 얽히고 싶어할까요? 나는 대답을 '. –