簡體   English   中英

使用System.IO.BinaryWriter寫入文件

[英]Writing File using System.IO.BinaryWriter

我正在嘗試使用C#的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。

代碼本身有效,文件創建成功。 當我打開文件時出現問題,第一個文件運行正常,第二個文件無法被Windows Media Player識別。

有人對我可能做錯的事情有任何想法嗎?

Encoding e = Encoding.ASCII;

看起來可疑。 我不知道任何使用ASCII編碼的音頻格式。

永遠不要像讀取文本一樣讀取任意二進制數據。 總是出錯,因為它們不是同一回事。

另外,不要依賴於流的長度-它可能會改變,或者可能不支持獲取它。

您想要這樣的東西:

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是罰款了點。

對於大多數編碼,包括Encoding.ASCII,將字節轉換為char並再次返回將不會返回相同的數據。 例如,IIRC Encoding.ASCII將范圍在128-255之間的所有字節映射到“?” 字符。 然后,當您轉換回字節時,它們都會全部轉換回相同的值。

Latin1 aka ISO-8859-1 aka代碼頁28591編碼是一個例外,它將映射所有十六進制值在0-255范圍內的字節到具有相同十六進制值的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));

不過,除非您有充分的理由這樣做,否則我不會以這種方式將字節轉換為char。

編碼用於將字符串編碼為字節,然后再編碼為字符串。

您正在反向使用它,解碼的內容不是字符串開頭的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM