[英]Encoding a long to a VLQ byte array and writing it to 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.