2009-05-31 46 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); 
}