2016-08-16 5 views
1

は、ゲームは、現在でロードされている私はファイル名(文字列)を取得する工程(ゲーム)のメモリを読みたいプロセス・メモリからバイトの非固定長バッファからマップのバイトストリーム/バッファから文字列に変換する際にガベージ文字を削除するにはどうすればよいですか?

の正確な長さの文字列を取得しますプロセスメモリ。

予測文字列がない固定長のものであり、可能な最大値は37であるので、私は、読み出し部は、Win32 APIを使用して簡単だった長さのバッファを37

を宣言しました。

byte[] pBuffer = new byte[37]; 
ReadProcessMemory((int)processHandle, (int)address, pBuffer, 37, ref read); 

ここで、バイトを文字列に変換するコードを示します。

出力は正常ですが、文字列には表示されていないガベージ文字が含まれています。

ファイルを開こうとしたときに、FileExist(map)関数がfalseを返します。ファイルはフォルダ内にありますが、メモリから取得するすべての文字列に対してString.Lengthが37であることがわかりました。

例えばファイル名が"abc.bms"であり、そのな長さ(String.Lenghtは)です。私がこれまで試した

ソリューション: -

// string = string.Substring(0, string.IndexOf('\0')); 
    // string = string.Replace('\0'); 
    // string = string.Trim(); 

文字列の長さは、私は、文字列からすべてのものを目に見えない文字を削除したい場合は、正しくないのですか?

+0

あなただけのヌル文字を削除しますか? 'var res = str.Replace(" \ 0 "、string.Empty);'? –

+0

いいえ、文字列のすべての余分な文字が欲しいです、私はファイルシステムのファイル名と比較したいです。明らかに文字列は問題ありませんが、正しいファイルパスを教えてくれない隠された余分な文字があります。 –

+0

なぜエンコーディングとしてASCIIを使用していますか?この値をファイルパスとして使用します。 Win32 APIでは、文字列が.NETにあるように、ファイルパスはUTF-16です。Win32関数(NTFSで[Unicode]が必要とする完全な文字セットをサポートしていない)のWindows 95互換バリアント(xxxA)を使用していて、 "ANSI"エンコーディングでファイルパスを取得した場合は、特定のANSIエンコーディングを知るか、スレッドの現在のANSIコードページと同じであることを確認します。その場合(そして他の場合は)、 'Encoding.Default'を使用します。 –

答えて

0
TrimEnd(new char[] { (char)0 }) 

空のバイトを削除するには、リンクをチェックアウト:

Trim Empty Bytes

はWiktor第さんのコメントに似ているようです。

0

メモリ内の文字列がヌルで終了するASCII文字列であると仮定すると、バッファをGetStringに渡す前にバッファを切り捨てる方がよいでしょう。

pBuffer配列の最初の0(NULL)は、Nサイズの新しいバッファを割り当てます(Nは最初の0より前のバイト数)。 pBufferから新しい配列にNバイトをコピーし、その新しい配列をGetStringに渡します。

更新:サンプルコード

using System; 
using System.Linq; 
using System.Text; 

public class Program 
{ 
    public static void Main() 
    { 
     byte[] x = new byte[] { 55,55,55,93,93,0,23,0}; 
     var firstNullIndex = Array.FindIndex(x, b => b == 0); 

     string s = Encoding.Default.GetString(x, 0, firstNullIndex); 
     Console.WriteLine(s); 

    } 
} 
+0

実際には、GetStringのオーバーロードが発生します。だから、pBufferとNをGetStringのオーバーロードに渡してください。 –

+0

pBuffer配列の切り捨てを手伝ってもらえますか?どのようにバッファ配列を検索し、新しいものを作成するには、2行のコードがその仕事をするでしょう –

関連する問題