.NET 4.0 이전의 C #에서 포인터 산술을 수행하는 안전한 방법이 있습니까?

스미스 씨

나는 오늘 저녁 내가 작성한 일부 도우미 코드 SIGSERV가 64 비트 포인터를 32 비트로 캐스팅했기 때문에 64 비트 컴퓨터에서 다소 불쾌한 충돌 의 원인이라는 것을 발견했습니다 .

class FastPixelEditor {
    Bitmap m_bitmap;
    Rectangle m_source;
    BitmapData m_bitmapData;
    int m_nativePixelPointer;
    public FastPixelEditor(Bitmap bitmap, Rectangle source) {
        m_bitmap = bitmap;
        m_source = source;
        m_bitmapData = m_bitmap.LockBits(source, 
            ImageLockMode.ReadWrite, PixelFormat.Format32bppArgb);
        m_nativePixelPointer = m_bitmapData.Scan0.ToInt32();
    }
    public void SetPixel(int x, int y, Color color) {
        int idx = (y - m_source.Top) * m_source.Width + 
            (x - m_source.Left); 
        idx *= 4;
        Marshal.WriteInt32((IntPtr)(m_nativePixelPointer + idx), 
            color.ToArgb());
    }
    public Color GetPixel(int x, int y) {
        int idx = (y - m_source.Top) * m_source.Width + 
            (x - m_source.Left);
        idx *= 4;
        return Color.FromArgb(Marshal.ReadInt32((IntPtr)(
            m_nativePixelPointer + idx)));
    }
    public void Unlock() { m_bitmap.UnlockBits(m_bitmapData); }
}

충돌은 GetPixel함수의 다음 줄에서 발생 합니다.

Marshal.ReadInt32((IntPtr)(m_nativePixelPointer + idx))

도우미 코드이기 때문에이 코드를 사용하는 사람 /unsafe에게 프로젝트에 컴파일 플래그 를 설정하도록 강요하는 것이 현명한 것이 아닌지 의심 스럽지만 사용하는 IntPtr.ToInt64()것은 실제로 해커처럼 보입니다 (아마도 작동 할 것입니다).

IntPtr.Add정확히 내가 추구하는 것처럼 보이지만이 코드는 .NET 2.0을 대상으로해야 IntPtr.Add하며 .NET 4.0에 추가되었습니다.

오전 나는 사이에서 결정을 강요 /unsafe하거나 IntPtr.ToInt64()또는 다른 옵션이 있습니다?

스미스 씨

그냥 것을 발견 Marshall.ReadInt32하고 Marshall.WriteInt32실제로는 지정 오프셋 허용 과부하가 :

Marshall.ReadInt32(IntPtr ptr, int ofs)

.NET 2.0에서 사용할 수 있습니다.

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

폴리머에서 안전한 HTML 데이터 바인딩을 허용하는 방법이 있습니까?

분류에서Dev

.NET 4에서 C # 6 이상을 사용하는 방법이 있습니까?

분류에서Dev

C ++에는 클래스 멤버 개체의 멤버 함수에 대한 포인터를 전달하는 정의 된 방법이 있습니까?

분류에서Dev

참조에 의한 전달을 포인터에 의한 전달이라고도 할 수 있습니까?

분류에서Dev

.net core ILogger 인터페이스의 예외 데이터 사전에서 값을 기록하는 방법이 있습니까?

분류에서Dev

void 포인터의 캐스트에서 산술을 수행 할 수없는 이유는 무엇입니까?

분류에서Dev

C에서 함수 포인터를 얻는 이러한 방법 사이에 차이점이 있습니까?

분류에서Dev

C에서 다음 데이터 blob에 대한 포인터를 반복하는 것이 안전합니까?

분류에서Dev

C # 가장 안전한 방법은 유형이 인터페이스에 유형을 포함하는지 확인합니다.

분류에서Dev

C : 함수 호출을 통해 수행 할 때 포인터 산술이 작동하지 않습니까?

분류에서Dev

포인터 간의 산술을 수행하는 적절한 방법

분류에서Dev

C ++ 20 이전의 C ++에서 관계 연산자를 정의하는 더 좋은 방법이 있습니까?

분류에서Dev

C에서 비정상적인 수의 함수 매개 변수를 전달하는 방법이 여전히 의도 한대로 작동 할 수 있습니까?

분류에서Dev

포인터를 매개 변수로 요구하는 함수 프로토 타입을 기반으로 사전 정의하지 않고 변수에 대한 포인터를 전달하는 방법이 있습니까?

분류에서Dev

R에서 벡터의 요소에 대해 산술을 쉽게 수행 할 수있는 방법이 있습니까?

분류에서Dev

F #에서 0을 void 포인터로 나타내는 방법이 있습니까?

분류에서Dev

함수의 모든 인수에 동일한 값을 전달하는 방법이 있습니까?

분류에서Dev

C에서 할당 된 포인터에 malloc하는 것이 안전합니까?

분류에서Dev

클래스의 포인터에 대한 대괄호 연산자를 정의하는 방법이 있습니까?

분류에서Dev

함수 자체에 전달하는 포인터에서 realloc ()을 호출하는 것이 안전합니까?

분류에서Dev

C 포인터, 배열을 함수에 전달하는 방법 이해

분류에서Dev

ASP.net C #에서 Javascript에서 CS로 제어를 전달할 수있는 방법이 있습니까?

분류에서Dev

C 포인터 행렬을 함수에 전달하는 다른 방법

분류에서Dev

ufw 프로파일을 사용하는 동안에 만 단일 인터페이스 (tun0)에서 포트를 열 수 있습니까?

분류에서Dev

vba (Visual Basic / VB.NET)의 한 줄에 다른 모든 작업을 수행하는 방법이 있습니까?

분류에서Dev

C의 이상한 포인터 산술

분류에서Dev

Django에서 Model 필드를 안전하게 삭제할 수있는 안전한 방법이 있습니까?

분류에서Dev

ggmap mapdist를 사용하여 R에서 한 번에 여러 개의 데이터 포인트를 실행할 수있는 방법이 있습니까?

분류에서Dev

C # : 열거 형을 인수로 전달하는 방법이 있습니까?

Related 관련 기사

  1. 1

    폴리머에서 안전한 HTML 데이터 바인딩을 허용하는 방법이 있습니까?

  2. 2

    .NET 4에서 C # 6 이상을 사용하는 방법이 있습니까?

  3. 3

    C ++에는 클래스 멤버 개체의 멤버 함수에 대한 포인터를 전달하는 정의 된 방법이 있습니까?

  4. 4

    참조에 의한 전달을 포인터에 의한 전달이라고도 할 수 있습니까?

  5. 5

    .net core ILogger 인터페이스의 예외 데이터 사전에서 값을 기록하는 방법이 있습니까?

  6. 6

    void 포인터의 캐스트에서 산술을 수행 할 수없는 이유는 무엇입니까?

  7. 7

    C에서 함수 포인터를 얻는 이러한 방법 사이에 차이점이 있습니까?

  8. 8

    C에서 다음 데이터 blob에 대한 포인터를 반복하는 것이 안전합니까?

  9. 9

    C # 가장 안전한 방법은 유형이 인터페이스에 유형을 포함하는지 확인합니다.

  10. 10

    C : 함수 호출을 통해 수행 할 때 포인터 산술이 작동하지 않습니까?

  11. 11

    포인터 간의 산술을 수행하는 적절한 방법

  12. 12

    C ++ 20 이전의 C ++에서 관계 연산자를 정의하는 더 좋은 방법이 있습니까?

  13. 13

    C에서 비정상적인 수의 함수 매개 변수를 전달하는 방법이 여전히 의도 한대로 작동 할 수 있습니까?

  14. 14

    포인터를 매개 변수로 요구하는 함수 프로토 타입을 기반으로 사전 정의하지 않고 변수에 대한 포인터를 전달하는 방법이 있습니까?

  15. 15

    R에서 벡터의 요소에 대해 산술을 쉽게 수행 할 수있는 방법이 있습니까?

  16. 16

    F #에서 0을 void 포인터로 나타내는 방법이 있습니까?

  17. 17

    함수의 모든 인수에 동일한 값을 전달하는 방법이 있습니까?

  18. 18

    C에서 할당 된 포인터에 malloc하는 것이 안전합니까?

  19. 19

    클래스의 포인터에 대한 대괄호 연산자를 정의하는 방법이 있습니까?

  20. 20

    함수 자체에 전달하는 포인터에서 realloc ()을 호출하는 것이 안전합니까?

  21. 21

    C 포인터, 배열을 함수에 전달하는 방법 이해

  22. 22

    ASP.net C #에서 Javascript에서 CS로 제어를 전달할 수있는 방법이 있습니까?

  23. 23

    C 포인터 행렬을 함수에 전달하는 다른 방법

  24. 24

    ufw 프로파일을 사용하는 동안에 만 단일 인터페이스 (tun0)에서 포트를 열 수 있습니까?

  25. 25

    vba (Visual Basic / VB.NET)의 한 줄에 다른 모든 작업을 수행하는 방법이 있습니까?

  26. 26

    C의 이상한 포인터 산술

  27. 27

    Django에서 Model 필드를 안전하게 삭제할 수있는 안전한 방법이 있습니까?

  28. 28

    ggmap mapdist를 사용하여 R에서 한 번에 여러 개의 데이터 포인트를 실행할 수있는 방법이 있습니까?

  29. 29

    C # : 열거 형을 인수로 전달하는 방법이 있습니까?

뜨겁다태그

보관