byte[]配列をIntPtrに変換するにはどうすればよいですか?[重複]
-
14-11-2019 - |
質問
重複の可能性:
C# で byte[] から IntPtr を取得する方法
メモリから文字列を読んでいます
byte[] array =
reader.ReadProcessMemory((IntPtr)address, (uint)255, out bytesReadSize);
次に、この配列を文字列に変換します。
プログラムのメモリ内のアドレス 003A53D4 の下に、文字列を指すポインタがあるため、問題が発生しました。文字列のアドレスを取得するにはどうすればよいですか?ありがとう :)
それが私が試したことです:
IntPtr pointers_address = new IntPtr(module_base_address + 3822548);
byte[] pointer_arrays =
reader.ReadProcessMemory(pointers_address, (uint)16, out bytesReadSize2);
IntPtr pointer_for_string = new IntPtr();
Marshal.Copy(pointers_array, 0, pointer_for_string, 16);
(4行目あたり):
値を null にすることはできません。パラメータ名:行き先
そして私が変わるとき 新しい IntPtr() 新しいものへ IntPtr(1)それは言う
保護されたメモリの読み取りまたは書き込みを試行しました。多くの場合、これは他のメモリが破損していることを示しています。
解決
使用できます Encoding.GetString()
バイトを文字列に変換します。どのエンコーディングを使用するかは、文字列のエンコーディングによって異なります。UTF8 エンコードの場合は Encoding.UTF8.GetString(pointer_arrays, 0)、ユニコードの場合は Encoding.Unicode、ASCII の場合は Encoding.ASCII、システムのデフォルトのコード ページの場合は Encoding.Default。
他のヒント
最良の方法 (IMO) は次のとおりです。
GCHandle pinned = GCHandle.Alloc(array , GCHandleType.Pinned);
IntPtr address = pinned.AddrOfPinnedObject();
reader.ReadProcessMemory(address, (uint)255, out bytesReadSize);
pinned.Free();
所属していません StackOverflow