2013-07-10 2 views
12

unsafebyte*은 알려진 길이의 기본 바이트 배열을 가리 킵니다. 어떻게하면 byte[]으로 변환 할 수 있습니까? 이 목적을 위해 conversion constructor이 있기 때문에 제로 종료 기본 문자열을 가리키는 unsafesbyte*안전하지 않은 바이트 *를 바이트 []로 변환

은 쉽게 C# string로 변환 할 수 있습니다,하지만 난 byte[]byte*을 변환하는 간단한 방법을 찾을 수 없습니다.

byte[] arr = new byte[len]; 
Marshal.Copy((IntPtr)ptr, arr, 0, len); 

을하지만 기본 메모리에 안전하지 않은 포인터 온 방법 궁금해 않습니다

+0

은 기본적으로'byte []'가'const byte *'이어야합니까? 그래서 포인터를'* (myByte + index);와 같이 색인을 붙이려고 시도해보십시오. 그러나 쉽게 들으 려하지 않았 으면 좋겠다고 생각합니다 .... – Shark

+0

'* (myByte + index)'를' myByte [index]'. 전환 할 필요가 없습니다. –

+0

@HenkHolterman IPAddress의 생성자에 전달해야하므로 바이트 []로 변환해야합니다. – kol

답변

15

ptr이 안전하지 않은 포인터이며, 배열의 길이 len이있는 경우,이 같은 Marshal.Copy을 사용할 수 있습니다. 안전하지 않은 포인터 대신 IntPtr을 사용하여 문제를 해결할 수 있습니까? 그렇다면 안전하지 않은 코드가 필요 없을 것입니다.

+0

이 코드는 좋았습니다. 지적한 배열을 가로 지르는 것이 좋습니다. 손으로 작성, 또는 memcpy,하지만이 일을하는 C#의 방법처럼 보인다. (y) – Shark

+0

이 질문은 후속 조치입니다. http://stackoverflow.com/questions/17549123/c-sharp-performance-using-unsafe-pointers-instead-of-intptr-and-marshal – kol

+0

I 내가 당신이라면'IntPtr'와'Marshal.Copy'를 향해 잘못 알았습니다. –

1

Marshal 클래스가 도움이 될 수 있습니다.

byte[] bytes = new byte[length]; 
for(int i = 0; i < length; ++i) 
    bytes[i] = Marshal.ReadByte(yourPtr, i); 

난 당신이 너무 Marshal.Copy을 사용할 수 있습니다 생각합니다.

+4

안전하지 않은 블록에서 발생해야하기 때문에'Marshal.ReadByte'가 필요하지 않으며 좋은 구식 포인터 역 참조와 포인터 증가를 사용할 수 있습니다. 즉, Marshal.Copy를 사용하는 대신 루프에서 복사를 수행하려는 경우입니다. –

관련 문제