2017-03-29 21 views
0

テキスト形式以外の形式のファイルを読み込む方法にはいくつか問題があります。私は与えられたファイルの中に文字列としての情報があることを知っています。私は、16進コードのいくつかの組み合わせの後に文字列がファイルに書き込まれる可能性があることを知っているので、プロセスの別の機能のために私を助けているテキストファイルに16進コードを書き込むことができました。C#バイナリファイル内の文字列の読み込み

たとえば、このバッチの16進コードがあります。 00 39 AF 32 DD 24 BA 09 07 06 03 DB 16進コードがAF 32に等しい場合、次の情報は文字列でなければなりません。たとえば、「請求書番号223232」

ご意見やご指摘をお待ちしております。

敬具、

static void Main(string[] args) 
    { 
     StreamWriter writer = new StreamWriter("output.txt", true); 
     FileStream fs = new FileStream("File", FileMode.Open); 
     int hexIn; 
     String hex; 
     for (int i = 0; (hexIn = fs.ReadByte()) != -1; i++) 
     { 
     writer.Write(hexIn + " "); 
     hex = string.Format("{0:X2}", hexIn); 
     writer.Write(hex + " "); 
     } 
    } 
+0

データのサンプルを表示しますか? – Trey

+0

このようなものを試してください:string input = "00 39 AF 32 DD 24 BA 09 07 06 03 DB"; (x、System.Globalization.NumberStyles.HexNumber))。ToArray(););]]]]]]]]]]; – jdweng

+1

注:DD 24 BA 09 07 06 03 DBは、私が今まで見た共通のエンコーディングの文字列を見ません... – Tim

答えて

0

あなたはバイナリファイルではなく、16進数でエンコードされたテキストファイルを読み込むしようとしているようにあなたが持っているサンプルコードが見えます。

ソースファイルがバイナリ(理想的な場合)の場合は、それをバイト単位で読み込み、ステートマシンを実行して文字列がいつ来るかを知ることができます。あなたは文字列の長さを知る必要があります。以下のサンプルでは、​​NULL終了Cスタイルの文字列を想定しています。パスカルスタイルの文字列の場合は、長さの接頭辞を読むか、または固定幅の場合は予想される文字数を追跡するだけです。

bool done = false; 
int state = 0; 
StringBuilder result = new StringBuilder(); 
while (!done) { 
    int byteValue = fs.ReadByte(); 
    if (bytesValue == -1) 
     done = true; 
    else { 
     switch (state) { 
     case 0: //looking for 0xAF 
      if (byteValue == 0xAF) 
       state = 1; 
      break; 
     case 1: //looking for 0x32 
      if (byteValue == 0x32) 
       state = 2; 
      else 
       state = 0; 
      break; 
     case 2: //start reading string 
      if (byteValue == 0) {//end of C-style string 
       //Do something with result.ToString() 
       result.Clear(); 
       state = 0; //go back to looking for more strings 
      } else { 
       result.Append((char)byteValue); //assuming 8-bit ASCII string 
      } 
      break; 
     } 
    } 
} 

あなたは16進数でエンコードされたテキストファイルを読んでいる場合は、一度に進ニブルを読み、バイトを再構築しなければならないとして、それは、より困難であろうが、ステートマシンのアプローチは同様であろう。

+0

こんにちは、あなたはまったく正しい、バイナリファイルです。あなたのコードを試しましたが、byteValueは0xAFまたは0x32ではなくint型の数値を返しています。 – Faqundo

+0

'(char)byteValue'もISO 8859-1の前提で動作します。しかし、なぜそれを仮定し、それをなぜそんなに書くべきなのでしょうか?テキストはありませんが、エンコードされたテキストです。バイトシーケンスを 'result'に集め、シーケンスが完全に読み込まれた後に_で書かれたエンコーディングでそれを変換するだけです。 –

+0

私は解釈しようとしているファイルタイプについて、IBMからの高度な機能のプレゼンテーションについていくつかの調査を行った。 Lengthレコードの長さを指定する2バイトのフィールド(5A制御文字を含まない)。 ID(Identifier)構造化フィールドのタイプを指定する3バイトのフィールド。フラグバイトデータフィールドに関する情報を指定する1バイトのフィールド。シーケンス番号レコードを識別する2バイトのフィールド。コントロールとデータテキストコントロールコード、オブジェクトの名前、またはイメージまたはページセグメントを配置するための座標。制御情報の後にデータが続く。 – Faqundo

関連する問題