나는 오늘 저녁 내가 작성한 일부 도우미 코드 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] 삭제
몇 마디 만하겠습니다