2009-07-17 3 views
0

C#의 System.IO.BinaryWriter class을 사용하여 오디오 파일을 쓰려고합니다.System.IO.BinaryWriter를 사용하여 파일 쓰기

나는이 작업을 수행 할 때 그것은 잘 작동 :

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

내가 배열 두 경우 모두, 바이트 배열을 체크 아웃 :

File.WriteAllBytes(@"C:\TestFile\File1", br.ReadBytes((int)br.BaseStream.Length)); 

그것이 내가 다음 작업을 수행 할 때 작동하지 않습니다하지만를 동일한 값을 포함하고 있습니다 (필자는 그 값을 별도의 Excel 파일에 복사하고 차이점이 있는지 확인했지만 없음).

는 두 경우 모두 기본 스트림의 위치는 파일이 성공적으로 생성, 0

자체가 작동하는 코드로 설정됩니다. 이 문제는 파일을 열 때 첫 번째 파일이 제대로 작동하고 두 번째 파일이 Windows Media Player에서 인식되지 않을 때 발생합니다.

누구나 내가 잘못하고있는 것에 대한 아이디어가 있습니까?

답변

1
Encoding e = Encoding.ASCII; 

의심스러운 것 같습니다. ASCII를 사용하여 인코딩 된 오디오 형식을 알지 못합니다.

1

절대로 텍스트 인 것처럼 임의의 이진 데이터를 읽지 않습니다. 그것들은 단지 똑같지 않기 때문에 항상 잘못됩니다.

또한 스트림의 길이에 의존하지 마십시오. 변경 될 수 있거나 어쨌든 가져 오기를 지원하지 않을 수 있습니다.

당신이 뭔가 원하는 : 당신이 얻고있는 곳

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은 이에 적합합니다.

+0

"결코 텍스트와 같이 임의의 2 진 데이터를 읽지 마십시오."- 거의 동의하지 않는다면 동의합니다. 하지만 유용하다고 생각한 사례를 보았습니다. 제어 문자와 ASCII 텍스트로 구성된 직렬 포트를 통해 메시지를 보냅니다. 이 경우 메시지를 문자열로 처리하는 것이 더 쉬울 수 있습니다. – Joe

1

Encoding.ASCII를 비롯한 대부분의 인코딩을 사용하면 바이트를 chars로 변환 한 후 다시 사용해도 동일한 데이터가 다시 제공되지 않습니다. 예를 들어, IIRC Encoding.ASCII는 128-255 범위의 모든 바이트를 '?' 캐릭터. 그런 다음 다시 바이트로 변환하면 모두 동일한 값으로 변환됩니다.

예외는 16 진수 값이 0-255 인 모든 바이트를 동일한 16 진수 값의 유니 코드 문자로 매핑하는 Latin1 일명 ISO-8859-1 인코딩입니다. 그럼에도 불구하고

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

당신이 그렇게 할 이유가없는 한,이 방법으로 문자 바이트를 변환 할 것입니다 : 다음은 당신이 원하는 결과를 제공해야합니다.

0

인코딩은 문자열을 바이트로 인코딩 한 다음 다시 문자열로 인코딩하는 데 사용됩니다.

문자열을 역으로 사용하여 역방향으로 사용하고 있습니다.