3

バイナリファイルがあります(つまり、0x00から0xFFまでの値のバイトが含まれています)。ファイルには、正規表現を使用して検索および編集したいASCII文字列(「HelloWorld」など)もあります。次に、編集したファイルを、古いファイルとまったく同じになるように書き出す必要がありますが、ASCII編集が実行されています。どのように?

        byte[] inbytes = File.ReadAllBytes(wfile);
        string instring = utf8.GetString(inbytes);
        // use Regex to find/replace some text within instring
        byte[] outbytes = utf8.GetBytes(instring);
        File.WriteAllBytes(outfile, outbytes);

編集をしなくても、出力ファイルと入力ファイルが異なります。何が起こっているのですか、そしてどうすれば私がやりたいことをすることができますか?


編集:わかりました、私は提供された提案を使用しようとしていますが、実際にそれを実装する方法を理解するのに苦労しています。これが私のサンプルコードです:

        string infile = @"C:\temp\in.dat";
        string outfile = @"C:\temp\out.dat";
        Regex re = new Regex(@"H[a-z]+ W[a-z]+");  // looking for "Hello World"
        byte[] inbytes = File.ReadAllBytes(infile);
        string instring = new SoapHexBinary(inbytes).ToString();
        Match match = re.Match(instring);
        if (match.Success)
        {
            // do work on 'instring'
        }
        File.WriteAllBytes(outfile, SoapHexBinary.Parse(instring).Value);

もちろん、そのようにするとマッチが得られないことはわかっていますが、正規表現を文字列(またはその他)に変換すると、マッチなどを使用できなくなります。何かアイデアはありますか?ありがとう!

4

3 に答える 3

2

すべてのバイナリ文字列が有効なUTF-8文字列であるとは限りません。バイナリをUTF-8文字列として解釈しようとすると、このように解釈できないバイトが壊れている可能性があります。基本的に、ファイル全体がエンコードされたテキストでない場合、エンコードされたテキストとして解釈しても、意味のある結果は得られません。

于 2012-10-18T20:04:34.213 に答える
1

バイナリファイルで遊ぶ代わりに、16進文字列に変換し、作業して(正規表現をここで使用できます)、保存して戻すこともできます。

byte[] buf = File.ReadAllBytes(file);
var str = new SoapHexBinary(buf).ToString();

//str=89504E470D0A1A0A0000000D49484452000000C8000000C808030000009A865EAC00000300504C544......
//Do your work

File.WriteAllBytes(file,SoapHexBinary.Parse(str).Value);

PS:名前空間:System.Runtime.Remoting.Metadata.W3cXsd2001.SoapHexBinary

于 2012-10-18T20:12:27.427 に答える
-1

わかった!コードをチェックしてください:

        string infile = @"C:\temp\in.dat";
        string outfile = @"C:\temp\out.dat";
        Regex re = new Regex(@"H[a-z]+ W[a-z]+");   // looking for "Hello World"
        string repl =  @"Hi there";

        Encoding ascii = Encoding.ASCII;
        byte[] inbytes = File.ReadAllBytes(infile);
        string instr = ascii.GetString(inbytes);
        Match match = re.Match(instr);
        int beg = 0;
        bool replaced = false;
        List<byte> newbytes = new List<byte>();
        while (match.Success)
        {
            replaced = true;
            for (int i = beg; i < match.Index; i++)
                newbytes.Add(inbytes[i]);
            foreach (char c in repl)
                newbytes.Add(Convert.ToByte(c));
            Match nmatch = match.NextMatch();
            int end = (nmatch.Success) ? nmatch.Index : inbytes.Length;
            for (int i = match.Index + match.Length; i < end; i++)
                newbytes.Add(inbytes[i]);
            beg = end;
            match = nmatch;
        }
        if (replaced)
        {
            var newarr = newbytes.ToArray();
            File.WriteAllBytes(outfile, newarr);
        }
        else
        {
            File.WriteAllBytes(outfile, inbytes);
        }
于 2012-10-22T16:52:41.873 に答える