2010-06-07 3 views
2

다음은 "Endogine"엔진에서 빌린 코드입니다.C# SwapBytes 코드 x64 호환

unsafe protected void SwapBytes(byte* ptr, int nLength) 
{ 
    for(long i = 0; i < nLength/2; ++i) { 
     byte t = *(ptr + i); 
     *(ptr + i) = *(ptr + nLength - i - 1); 
     *(ptr + nLength - i - 1) = t; 
    } 
} 

내가 x64 아키텍처를 대상으로 할 때 실패 할 것 같다,하지만 포인터가이 int32 캐스팅하지 않기 때문에 왜, 나는 알아낼 수 없습니다 : 어떤 바이트 배열의 바이트 순서를 교환 할 예정이다. 도움이 되었습니까?

+0

nLength와 i 모두 int 유형을 사용해 보았습니까? 또한 당신이 얻고있는 오류는 무엇입니까? – Sijin

+0

x86 및 x64에서 특정 바이트 시퀀스 (예 : 0x01, 0x02, 0x03, 0x04)를 실행할 수 있고 일치하지 않는 결과가 표시되면 도움이 될 수있는 경우. –

답변

1

어떤 식 으로든 실패로 보입니까? 꽤 똑바로 보인다. 나는 조금 더 빨리를 만들기 위해 두 개의 포인터를 사용합니다 :

unsafe protected void SwapBytes(byte* ptr, int nLength) { 
    byte* ptr2 = ptr + nLength - 1; 
    for(int i = 0; i < nLength/2; i++) { 
    byte t = *ptr; 
    *ptr = *ptr2; 
    *ptr2 = t; 
    ptr++; 
    ptr2--; 
    } 
} 

그러나, 컴파일러 최적화 루프에서 꽤 좋은이며, 배열에 액세스합니다. 같은 코드를 관리하는 코드가 안전하지 않은 코드와 매우 비슷하게 작동하는 것 같습니다.

protected void SwapBytes(byte[] data) { 
    for(int i = 0, j = data.Length - 1; i < data.Length/2; i++, j--) { 
    byte t = data[i]; 
    data[i] = data[j]; 
    data[j] = t; 
    } 
} 
관련 문제