@darion8 (智史 酒井)

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

バイナリから特定の範囲を出力するバッチを作りたい

Q&A

Closed

バイナリから特定の文字列A・Bを見つけたら、次の文字列Aまでをファイルとして出力するバッチファイルを作りたいのですが知識がないので大まかな手順を思い付いても記述方がわかりません

A=UNIT    B=FOMATとして
バイナリから文字列(数列?554E4954ということでいいんでしょうか?)Aを探す或いはAと似てる文字列(UNSSとか)を見つけたらAと同じに修正
↓          
文字列Bを探す(AとBの間に適当なものが入ってても問題なし)或いはA同様Bに似てる文字列を見つけたらBに修正
↓               
次のAが見つかるまでの範囲を拡張子付ファイルとして出力し、範囲を削除(消さなくても次のAを探してくれるなら削除はいらない)

という感じです
どうやって書いていけばいいでょうか?

0 likes

3Answer

バイナリと文字列どちらなんでしょう?
文字列の検索なら、String.IndexOf や Regex.Match(またはMatches) 等が使えますが。
ちょっと質問が判り難いので、どういう入力データに対して、どういう出力データが欲しいか、具体的なデータを書く事は出来ますか?

0Like

言ってしまうと一塊になっている音声データ(そのままでは再生不可)を切り分け、wem形式に出力したいんです
文字列と言っていたのは赤い所を指したつもりで言ってました
A=RIFF  B=WAVEfmt
キャプチャ.PNG
そして二枚目の次に来るAの直前を範囲に一つの音声として出力したいんです
キャプチャ2.PNG
修正というのはA・Bの通りではない一字違いの文字列があるのでそれを直すためです(直せば読み込む)

0Like

こんな感じで探せると思います。
あとは、探した位置から計算して、Span.Slice で分割すれば良さそうな。
ファイルサイズが大きい場合はReadAllBytesは厳しいので、部分的に読み込むとか工夫してください。

using System;
using System.IO;

class Program
{
    static void Main(string[] args)
    {
        var ascii = System.Text.Encoding.ASCII;
        var riffHeader = ascii.GetBytes("RIFF").AsSpan();
        var waveHeader = ascii.GetBytes("WAVEfmt").AsSpan();
        var bytesWav = File.ReadAllBytes(@"c:\test\test.wav").AsSpan();
        var indexRiff = bytesWav.IndexOf(riffHeader);
        var indexWave = bytesWav.IndexOf(waveHeader);
        Console.WriteLine($"IndexOf RIFF:{indexRiff} WAVE:{indexWave}");

        Console.ReadKey();
    }
}
0Like

Comments

  1. @darion8

    Questioner

    ありがとうございます!
    勉強しつつ試していきたいと思います

Your answer might help someone💌