2009-05-31 43 views
1

我正在讀取原始音頻文件(CD曲目翻錄),進行字節交換,然後寫回到wav文件。交換文件中的字節

例程我已正確處理字節,但只能處理大約一半的文件。我是一個VB.NET開發人員,不是真正的C#開發人員,並且此代碼不能正確轉換爲VB.NET(它會發生溢出錯誤)。

這不是一個真正的「交換」,而是一個計算/修剪。 (短)((緩衝[I + 1] * 256)+緩衝[1])

我相信這是寫只有一半的樣品,但我不知道如何解決!

 public static short[] SwapBytesArray(string fileName) 
    { 
     byte[] buffer = System.IO.File.ReadAllBytes(fileName); 
     long fileLength = buffer.LongLength; 
     if ((fileLength & 1) == 1) 
     { 
      throw new ArgumentException("File length must be an even number of bytes"); 
     } 
     System.Collections.Generic.List<short> sList = new System.Collections.Generic.List<short>(); 


     for (long i = 0; i < fileLength - 1; i += 2) 
     { 
      byte tmp = buffer[i]; 
      sList.Add((short)((buffer[i + 1] * 256) + buffer[i])); 
      //buffer[i + 1] = tmp; 
     } 
     return sList.ToArray(); 
    } 
+0

多虧了這個奇妙的一羣人的答案我已經升級上面的來源,但它仍然只處理一半的音頻。 – 2009-05-31 05:30:03

回答

1

爲什麼要返回short的數組?

如果你寫回到一個文件不會byte[]陣列是一個更好的選擇?

public static byte[] SwapBytes(string fileName) 
{ 
    byte[] buffer = System.IO.File.ReadAllBytes(fileName); 

    long fileLength = buffer.LongLength; 

    if ((fileLength & 1) == 1) 
    { 
     throw new ArgumentException("File length must be an even number of bytes"); 
    } 

    for (long i = 0; i < fileLength - 1 ; i +=2) 
    { 
     byte tmp = buffer[i]; 
     buffer[i] = buffer[i + 1]; 
     buffer[i + 1] = tmp; 
    } 

    return buffer; 
} 
+0

它可以是Byte []或Short [] – 2009-05-31 04:58:02

+0

我添加了你的代碼,並且改變了上面的代碼,但它仍然只處理文件的一半。 – 2009-05-31 05:27:02

1

如果文件的大小大於最大整數時,則你會溢出指數變量(指數應該是一個長久以來num是一個長)。據推測,你使用buffer.LongLength而不是buffer.Length,因爲你的數據被認爲是較大的,所以無論如何可能是一個問題。

1

這似乎令人難以置信的浪費內存。您將整個文件讀取爲一個字節序列,然後將其複製到short[]陣列中。當你返回數組時,你甚至可能再次複製它。

您的實際問題可能在於您在此函數返回時(而非字節)寫出短褲的方式。我認爲我們需要看到這些代碼。

1

我認爲流式方法會更有效率,並且不易出錯。 .NET有流很好的支持,所以像下面應該工作:

public void SwapBytesStreamed(Stream inputStream, Stream outputStream) 
{ 
    byte[] bytePair = new byte[2]; 
    long offset = 0; 
    while (offset < inputStream.Length) 
    { 
     int bytesRead = inputStream.Read(bytePair, 0, 2); 
     if (bytesRead == 0) break; 

     if (bytesRead == 2) 
     { 
      outputStream.WriteByte(bytePair[1]); 
     } 
     outputStream.WriteByte(bytePair[0]); 

     offset += bytesRead; 
    } 
} 

然後使用它像下面這樣:

public Stream SwapBytesInFile(string filename) 
{ 
    Stream inputStream = File.Open(filename, FileMode.Open); 
    MemoryStream outputStream = new MemoryStream(); 

    SwapBytesStreamed(inputStream, outputStream); 
}