2009-07-17 2 views
0

C#のSystem.IO.BinaryWriter classを使用してオーディオファイルを書き込もうとしています。System.IO.BinaryWriterを使用してファイルを書き込む

私はこのアクションを実行するときにそれが正常に動作します:

File.WriteAllBytes(@"C:\TestFile\File1", br.ReadBytes((int)br.BaseStream.Length)); 

、私は次の操作を実行したときに、それは動作しません。しかし:

Encoding e = Encoding.ASCII; 
char[] reslts = e.GetChars(br.ReadBytes((int)br.BaseStream.Length)); 
br.BaseStream.Position = 0; 
File.WriteAllBytes((@"C:\TestFile\File2",e.GetBytes(reslts)); 

私は両方のケースでは、配列、バイト配列をチェックアウト同じ値が含まれていました(別のExcelファイルに値をコピーして、違いがあるかどうかを確認しましたが、何もありません)。基本ストリーム位置をコード自体が機能0

に設定されている

どちらの場合も、ファイルが正常に作成されます。この問題は、ファイルを開いたときに最初のファイルが正常に動作し、2番目のファイルがWindows Media Playerで認識されない場合に発生します。

誰かが私が間違っている可能性のあるアイデアはありますか?

答えて

1
Encoding e = Encoding.ASCII; 

これは疑わしいです。私は、ASCIIを使ってエンコードされたオーディオフォーマットを知らない。

1

決して、テキストのように任意のバイナリデータを読んではいけません。彼らはちょうど同じものではないので、常に間違っています。

また、ストリームの長さに依存しないでください。ストリームの長さに依存しないでください。変更されたり、とにかくフェッチをサポートしない可能性があります。

あなたはこのような何かしたい:

public static byte[] CopyStream(Stream input, Stream output) 
{ 
    byte[] buffer = new byte[16*1024]; 
    int read; 
    while ((read = input.Read(buffer, 0, buffer.Length)) > 0) 
    { 
     output.Write(buffer, 0, read); 
    } 
} 

それからちょうどあなたが取得している場所を示していないあなたがデータを書き込みたい任意の場所にFileStreamを開き、

CopyStream(inputStream, outputFile); 

を呼び出しをからの入力ですが、基本的にはBinaryReaderは本当に必要ありません。それは通常の目的のためにBinaryReaderを使用しているようではありません。個々のプリミティブ値、長さ接頭文字列などを読み取るのと同じではありません。ちょうどデータをコピーしたいだけです。Streamはそれで問題ありません。

+0

「決して、テキストのように任意のバイナリデータを読んではいけません。しかし、私はそれが有用であるケースを見た。制御文字とASCIIテキストで構成されるシリアルポートを介してメッセージを送信します。この場合、メッセージを文字列として扱う方が簡単です。 – Joe

1

Encoding.ASCIIを含むほとんどのエンコードでは、バイトをcharsに変換して元に戻しても、同じデータが返されません。たとえば、IIRC Encoding.ASCIIは、128〜255の範囲のすべてのバイトを '?'にマップします。キャラクター。その後、バイトに変換すると、すべて同じ値に変換されます。

例外はLatin-1とも呼ばれ、16進値が0〜255のすべてのバイトを同じ16進値のUnicode文字にマップします。あなたがそうする正当な理由がない限り、私はこのように文字にバイトを変換しません。それにもかかわらず、

Encoding e = Encoding.GetEncoding(28591); 
// or either of the following is equivalent 
// Encoding.GetEncoding("Latin1"); 
// Encoding.GetEncoding("ISO-8859-1"); 

char[] reslts = e.GetChars(br.ReadBytes((int)br.BaseStream.Length)); 
br.BaseStream.Position = 0; 
File.WriteAllBytes((@"C:\TestFile\File2",e.GetBytes(reslts)); 

:次はあなたが望む結果を与える必要があります。

0

エンコーディングは、文字列をバイトにエンコードし、次に文字列に戻すために使用されます。

文字列ではないものをデコードして逆順に使用しています。

関連する問題