2013-02-05 3 views
2
나는 ReadProcessMemory()를 통해 메모리를 읽을려고

을 떠을 IntPtr로 변환 액세스 위반이, 그것은 확실히 메모리에서 부동의 (부동 소수점에서 읽기 값을 저장, 나는 그것을 확인했습니다 다른 유틸리티)하지만 내가 시도한 모든 것 (BitConverter, Marshal.Copy() 등)은 실패한 것 같다.C 번호 : Marshal.Copy()

나는 사례의 숫자 검토 한 난 그냥 내가 이해하지 못하는거야 모르겠어요.

나는 개념을 테스트 할 수있는 간단한 프로그램을 만들었다. 이 작업을 수행하는 다른 기술을 알고 있지만 문제가 있습니다. 그래서 지금 당장이 문제에 집중하고 있습니다. 기본적으로 나는 (알려진)의 IntPtr입니다 통해 4 바이트, 그것에 점의 배열의 float 값에서 바이트를 저장 한 다음 float로 IntPtr입니다 변환하려고 Marshal.Copy()를 사용 :

const int FLOAT_SIZE = 4; 
byte[] baSource = new byte[FLOAT_SIZE]; 
IntPtr ipIntermediate = Marshal.AllocHGlobal(sizeof(float)); 
float[] faDest = new float[1]; 

baSource[0] = 0xA7; 
baSource[1] = 0x68; 
baSource[2] = 0xB9; 
baSource[3] = 0x44; 

ipIntermediate = ((IntPtr)(baSource[0])); 
Marshal.Copy(ipIntermediate, faDest, 0, 1); // causes AccessViolation exception 

Windows 7 64 비트를 실행 중입니다. 현재 x86 용 빌드를 목표로 삼고 있지만 동일한 결과를 얻으려면 'Any CPU'만 시도했습니다. 엔디안 스는 문제가되지 않습니다.

도움을 주시면 감사하겠습니다.

답변

2

((IntPtr)(baSource[0])) 의미 : 배열의 첫 번째 요소를 가지고 가고, IntPtr로 변환. 실제로 원하는 것 : 바이트 배열의 첫 번째 요소의 주소를 가져옵니다. 나는이 오버로드를 사용하고

const int FLOAT_SIZE = 4; 
byte[] baSource = new byte[FLOAT_SIZE]; 
float[] faDest = new float[1]; 

baSource[0] = 0xA7; 
baSource[1] = 0x68; 
baSource[2] = 0xB9; 
baSource[3] = 0x44; 

var gch = GCHandle.Alloc(baSource, GCHandleType.Pinned); 
try 
{ 
    var source = gch.AddrOfPinnedObject(); 
    Marshal.Copy(source, faDest, 0, 1); 
} 
finally 
{ 
    gch.Free(); 
} 
+0

감사합니다. 데이터를 고정하는 것을 완전히 잊어 버렸습니다. 나는 그것을 시험해 보지 않았다. (나는 깨졌고 BitConverter.ToSingle()을 사용했다.) 작동해야만한다. –

0

아마 IntPtr입니다 그것이 Marshal.Copy로 호출, 포인터가 아닌 데이터로 해석 그래서 포인터이기 때문이다.

그 구성 바이트에서 float를 구축 할 수있는 매우 간단한 방법이 있다는

참고 :

float f2 = BitConverter.ToSingle(byteArray, 0); 
+0

: 당신이 이것을 달성하기 위해 안전하지 않은 코드 또는 GCHandle를 사용할 수 있습니다 http://msdn.microsoft.com/en-us/library/a53bd6cz.aspx ...은 의도되지 않는다 이 용도로? –

+0

네, 다소 그렇지만, 첫 번째 인수 인 ipIntermediate가 바이트 자체가 아닌 바이트에 대한 포인터가 될 것으로 기대합니다. –

+0

이것은 실제로 질문에 대답하지 않습니다. – Odrade