2009-05-31 5 views
1

바이트 스왑을 수행 한 후 원시 오디오 파일 (CD 트랙 립)을 읽은 다음 wav 파일에 다시 쓰고 있습니다.파일의 바이트 교환

루틴은 올바르게 바이트를 처리하지만 파일의 절반 만 처리합니다. 나는 VB.NET 개발자이고, C# 개발자는 아니며,이 코드는 VB.NET으로 제대로 변환되지 않는다. (오버 플로우 오류가 발생한다.)

정말 calc/prune만큼 "스왑"이 아닙니다. (짧은) ((버퍼 [I + 1] * 256) + 버퍼 [I])

나는 그것이 샘플의 절반을 쓰고 생각하지만, 내가 어떻게 해결하는 아무 생각도 없어!

 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

감사합니다 위의 소스이지만 여전히 오디오의 절반 만 처리합니다. –

답변

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 [] –

+0

코드를 추가하고 위 코드를 변경했지만 여전히 파일의 절반 만 처리합니다. –

1

파일의 크기가 최대 정수보다 큰 경우 인덱스 변수를 오버 플로우 것이다 (NUM 긴이기 때문에 인덱스가 오랫동안이어야한다). buffer.LongLength 대신 buffer.LongLength를 사용하는 것이 좋습니다. 데이터가 크면 상관 없으므로 가능성이있는 문제입니다.

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); 
}