2013-10-29 5 views
3

내가 무엇을하려고하는지 설명하겠습니다. Paint.NET 용 Filetype 플러그인을 작성하고 다양한 사용자 정의 인코딩 방법을 테스트하고 가장 작게 만드는 방법으로 파일을 저장하고 싶습니다. 파일 크기.C# 함수가 스트림을 반환합니다.

내 실제 코드입니다 (단지 내가하고 싶은 것을 보여주기 위해 단순화되었습니다). 그래서 여기

private void encode1(Stream output) 
{ 
    output.WriteByte(0xAA); 
} 
private void encode2(Stream output) 
{ 
    output.WriteByte(0xAA); 
    output.WriteByte(0xBB); 
} 

protected override void OnSave(Stream output) 
{ 
    if (saveSmallest) 
    { 
     // I can't find a clean way to test for the smallest stream size 
     // and then use the encoder that produced the smallest stream... 
    } 
    else if (selectedEncoder == 1) 
    { 
     encode1(output); 
    } 
    else if (selectedEncoder == 2) 
    { 
     encode2(output); 
    } 
} 

내가 (또한 간단하지만 아이디어는 여기에) 뭘하려하지만, 아무것도 어떤 경우에 파일에 기록되지 않았다 작동하지 않았다 : 음, 주석을 참조 제외 즉, 일 난 아무 생각이 왜 :

private Stream encode1() 
{ 
    Stream output = new MemoryStream(); 
    output.WriteByte(0xAA); 
    return output; 
} 
private Stream encode2() 
{ 
    Stream output = new MemoryStream(); 
    output.WriteByte(0xAA); 
    output.WriteByte(0xBB); 
    return output; 
} 

private void copyStream(Stream input, Stream output) 
{ 
    byte[] buffer = new byte[128]; 
    int read; 
    while ((read = input.Read(buffer, 0, buffer.Length)) > 0) 
    { 
     output.Write(buffer, 0, read); 
    } 
} 

protected override void OnSave(Stream output) 
{ 
    if (saveSmallest) 
    { 
     // get encoders's streams 
     Stream[] outputs = 
     { 
      encode1(), 
      encode2(), 
      //other encoders here 
     }; 

     // Find the smallest stream 
     int smallest = 0; 
     for (int i = 1; i < outputs.Length; i++) 
     { 
      if (outputs[i].Length < outputs[smallest].Length) 
      { 
       smallest = i; 
      } 
     } 
     //Copy the smallest into the final output 
     //output = outputs[smallest]; 
     copyStream(outputs[smallest], output); 
    } 
    else if (selectedEncoder == 1) 
    { 
     //output = encode1(); 
     copyStream(encode1(), output); 
    } 
    else if (selectedEncoder == 2) 
    { 
     //output = encode2(); 
     copyStream(encode2(), output); 
    } 
} 

내가 대신 스트림의 바이트 배열 작업을 시도했지만 바이트의 문제는 내가의 분명 아무 생각이 없기 때문에 내가 정말 큰 바이트 배열을 선언해야한다는 것입니다 인코딩에 필요한 바이트 수. 그것은 수백만이 될 수 있습니다 ...

저는 C#의 초보자입니다. 왜 그것이 전혀 작동하지 않는지, 어떻게 해결할 수 있는지 또는 개선 방법에 대해 알고 있다면 말해주십시오. 그러나 컴파일 된 후에는 2kb 이상을 필요로하는 복잡한 코드를 작성하지 마십시오. 작고 간단하며 효율적인 코드를 원합니다. 저수준 프로그래밍으로 기분이 나아졌습니다 ... 미리 감사드립니다!

+2

'Func '배열의 배열을 원할 수도 있습니다. –

+0

감사합니다. 대표자를 찾고 결코 사용하지 않았고 나를 어떻게 유용하게 사용할 수 있을지 모르겠다. ^^ – guix

답변

3

스트림을 복사하기 전에 Stream.Seek(0l, SeekOrigin.Begin);을 시도하십시오.

+0

그가 돌아 오기 전에 아마 원하는대로 각각의 크기 (현재 위치)를 비교하십시오. 하지만 네, 파일로 복사하기 전에 되감기해야합니다. –

+0

@BenVoigt thanx (사례를 위해 업데이트 됨) – neeKo

+0

고마워, 나는이 줄을 copyStream의 시작 부분에 추가했다 : input.Seek (0, SeekOrigin.Begin); 그리고 효과가있었습니다! – guix

관련 문제