2009-08-20 16 views
2

に[]バイトから変換します。 バイナリファイルは、整数と文字が混在しています。 整数はそれぞれ1バイトで、各文字は2バイトとしてファイルに書き込まれます。各整数は、それを次の文字列に関連付けられている:YOU45YOUはGREAT //を見て、そうは、私は、次のコードを持っている文字列

は注意してください上にあるどのように

1HELLO:

は例えば、ファイルには、次のようなデータを持っています。だから、1は "HELLO HOW ARE YOU"、45は "あなたが偉大に見える"などと関連しています。

バイナリは、 'H'(および他の文字)がそれぞれ2バイトを取る一方、 '1'は1バイトしか取らないように書かれています。だからここ

は、ファイルが実際に含まれているものです:

0100480045..andので、相続人 に内訳:

01は、整数1 0048のための最初のバイトであるH」の2バイトであります私がしたいこと:(E = 0x45)ように

と... を私は私のコンソールは、このファイルのうち、人間が読める形式を印刷したい 『E ' 0045は、2バイト(Hはヘックスで48あります』)それは "1 HELLO HOW ARE YOU"を印刷し、次に "45あなたは偉大に見える"などを印刷します。 。

私は正しいことをしていますか?より簡単で効率的な方法がありますか? 私の行Console.WriteLine(Convert.ToString(b [pos]));何もしませんが、実際の文字ではなく整数値を出力します。ファイル内の整数はOKですが、文字をどのように読み込むのですか?

ご協力いただければ幸いです。 ありがとう

+0

言語? – mkoryak

+0

私は自分の答えを削除しました - その形式を決めた人はどう思いましたか? :boggled: –

+0

整数フィールドは文字列とどのように区別されますか?文字をコードポイントU + 00FFより上にすることはできますか?整数を "0"にすることはできますか?整数は符号付きか符号なしですか? – outis

答えて

8

あなたが探しているものはEncoding.GetStringだと思います。

あなたの文字列データは、あなたの文字列を取得することができますどのように、2つのバイト文字で構成されているためには、次のとおりです。

for (int i = 0; i < b.Length; i++) 
{ 
    byte curByte = b[i]; 

    // Assuming that the first byte of a 2-byte character sequence will be 0 
    if (curByte != 0) 
    { 
    // This is a 1 byte number 
    Console.WriteLine(Convert.ToString(curByte)); 
    } 
    else 
    { 
    // This is a 2 byte character. Print it out. 
    Console.WriteLine(Encoding.Unicode.GetString(b, i, 2)); 

    // We consumed the next character as well, no need to deal with it 
    // in the next round of the loop. 
    i++; 
    } 
} 
+0

です。最初の "id"バイトを別々に読み取ってから、適切なエンコーディングを使用して残りのバイトを変換する必要があります。 – tvanfosson

+0

ああ、私は質問のビットを逃した。私は私の答えを編集します。 – paracycle

+0

最初の文字列の終了位置はコードによってどのように決定されますか?その情報がなければ、次の番号を検索する時期はわかりません。 –

1

あなたがバイトを取る文字列System.Text.UnicodeEncoding.GetStringを()[]使用することができます配列を作成し、文字列を生成します。 I found this link very useful

+0

あなたは本当にあなたの答えがそれ自身の上に立つことができるように要約を追加する必要があります。それは私のdownvoteではないが、私は確かになぜ誰かがそれが役に立たないと思った理由を理解することができます。 – tvanfosson

0
using (BinaryReader br = new BinaryReader(File.Open(FILE_PATH, FileMode.Open, FileAccess.ReadWrite))) 
{  
    int length = (int)br.BaseStream.Length;  

    byte[] buffer = new byte[length * 2]; 
    int bufferPosition = 0; 

    while (pos < length)  
    {   
     byte b = br.ReadByte();   
     if(b < 10) 
     { 
      buffer[bufferPosition] = 0; 
      buffer[bufferPosition + 1] = b + 0x30; 
      pos++; 
     } 
     else 
     { 
      buffer[bufferPosition] = b; 
      buffer[bufferPosition + 1] = br.ReadByte(); 
      pos += 2; 
     } 
     bufferPosition += 2;  
    }  

    Console.WriteLine(System.Text.Encoding.Unicode.GetString(buffer, 0, bufferPosition)); 

}

+1

ラインバッファでコードを使用しようとすると、次のコンパイラエラーが発生します。[bufferPosition + 1] = b + 0x30; : エラーCS0266: 'int'型を暗黙的に 'byte'に変換できません。明示的な変換があります(キャストがありませんか?) – zack

+0

また、length変数の値をチェックしました。これにはゼロのカウントが含まれています。だから私はあなたがやったように最初に2を乗じる必要がないと思う。 – zack

+0

申し訳ありませんが、16進数のキャストを忘れた場合、その行は です。 バッファ[bufferPosition + 1] = b +(byte)0x30; ただし、入力全体が整数の場合は、配列の全体サイズが2倍になるため、バッファ長に2を掛ける必要があります – LorenVS

関連する問題