MSDN C# DeflateStream 예제 코드 문제


0

아래 예제에서 100 (buffer.Length + 100)을 추가해야하는 이유는 무엇입니까? buffer.Length는 압축 해제 된 버퍼 길이와 같아야하므로 100 개를 추가 할 필요가 없습니다. :-) 사전에

http://msdn.microsoft.com/en-us/library/bc2dbwea.aspx

덕분에, 조지

3

나는 그들이 그렇게하는 이유를 모르겠지만, 그것은 일반적으로 좋은 예 아니다 - 예를 들어, 그들이 사용하는 대신 using 문을 사용하여, 또한 Read 단일 호출이 파일의 전체를 읽을 가정의 FileStreamClose (안 finally 블록)에 명시 적으로 호출합니다. 지옥, 전체 파일을 버퍼로 읽는 것조차 나쁜 아이디어입니다. 한 번에 청크를 DeflateStream으로 직접 복사하는 것이 좋습니다. 이 그 예에서 코드의 특정 홀수 비트 (추가 100 바이트)에 대한 걱정 가치가 있다고

이런 일들은 나에게 좋습니다. 확실히 그것을 "모범 사례"로 간주하지 마십시오.

MSDN 예는 이것보다 일반적으로 더 나은 - 다른 이상한 사람이 많이 있기는하지만.

편집이 : 코드와 CodeMelt의 답변을 다시 읽어 데, 그것은 참으로 여분의 100 바이트를 필요합니까 -하지만 ReadAllBytesFromStream은 너무 심하게 구현 때문. 여기에 항상 버퍼의 나머지 부분을 채우기 위해 스트림을 요청하는 더 나은 구현,이다 :

public static int ReadAllBytesFromStream(Stream stream, byte[] buffer) 
{ 
    int offset = 0; 
    int bytesRead; 
    while ((bytesRead = stream.Read(buffer, offset, 
            buffer.Length-offset)) > 0) 
    { 
     offset += bytesRead; 
    } 
    return offset; 
} 

(그들은 항상 같은 값을 가지고로 모두 offsettotalCount 필요가 없다고합니다.)

  0

나는 가까운 지점에 대해 완전히 동의하고 모든 바이트를 모두 읽는다. 난 그냥 압축 버퍼가 원래 버퍼의 동일한 길이, 관행에 100 바이트 또는 더 뭔가를 할당 할 필요가 있는지 확인하려면? 22 feb. 092009-02-22 12:26:54

  0

이전 구현 코드에는 어떤 경우에 문제가 있습니까? 예를 보여 주시겠습니까? 22 feb. 092009-02-22 14:13:38

  0

"count"매개 변수가 100으로 고정 되었기 때문에 배열 끝 부분에 도달하면 ArgumentException이 throw됩니다 (배열을 100 바이트 이상 필요하지 않은 경우). 22 feb. 092009-02-22 14:43:14

  0

안녕하세요 Jon Skeet, 어떤 종류의 파일 이러한 형식 예외가 발생합니까? 어떤 크기? 나는 하나의 테스트 케이스를 만들고 내 손을 더럽게 만드는 데 관심이있다. 24 feb. 092009-02-24 14:52:36

  0

여분의 100 바이트는 꺼내지만 * ReadAllBytesFromStream 메서드를 수정하지 않으면 예외가 throw됩니다. 이 경우 * 모든 파일에서 예외가 발생한다고 생각합니다. 24 feb. 092009-02-24 15:04:46


2

스트림이 아무것도 읽지 않을 때까지 읽기를 계속하기 때문에 stream.Read (buffer, offset, 100)가 다음 메소드 내에서 길이를 초과하는 것을 방지합니다.

public static int ReadAllBytesFromStream(Stream stream, byte[] buffer) 
{ 
//Use this method is used to read all bytes from a stream. 
int offset = 0; 
int totalCount = 0; 
    while (true) 
    { 
    //even it reads to the end, but it will still read the next 
    //100 bytes to see if anything has been read. 
    int bytesRead = stream.Read(buffer, offset, 100); 
     if (bytesRead == 0) 
     { 
     break; 
     } 
offset += bytesRead; 
totalCount += bytesRead; 
    } 
return totalCount; 
} 
  0

혼란스러워. :-(당신은 "길이 초과"와 어떤 시나리오에서 "길이 초과"를 의미합니까? 결과 길이가 원래 입력 길이와 같으면 100 바이트를 더 할당 할 필요가 없습니다. 22 feb. 092009-02-22 12:31:31

  0

ReadAllBytesFromStream은 버퍼의 길이를 검사하지 않습니다. 추가 100 바이트는 stream.Read (buffer, offset, 100)에 대한 공간을 제공하고 0을 반환합니다. 22 feb. 092009-02-22 12:33:46

  0

그러나 추가 공간을 만들 필요가 없다고 생각합니까? ?이 코드 패턴은 정말 이상한 이러한 추가 공간없는 경우 미치는 영향은 George2 @ 22 feb. 092009-02-22 12:36:52

  0

:. 예, 그냥 때문에 ReadAllBytesFromStream의 가난한 구현의 기본적의 더 나은 구현을 위해 내 업데이트 된 답변을 참조 22 feb. 092009-02-22 12:38:25

  0

어떤 상황 것이다 이전 구현에.. 코드에 문제가 있습니까? 예제를 보여 주시겠습니까? 22 feb. 092009-02-22 14:14:17