2016-06-01 7 views
0

nicht richtig dekodiert. Ich erhalte eine SGML-Datei, und ich extrahiere Daten daraus mit uuDecoder, und ich erstelle PDF daraus.Einige uuEncoded-Dateien werden in C#

Es funktioniert seit vielen Jahren gut, aber seit den letzten Monaten beobachten wir, dass einige der PDF-Dateien nicht geladen werden können und es heißt "Laden des PDF-Dokuments fehlgeschlagen" in Chrome.

Ich habe über diese Frage unten gegangen, die etwas ähnliches wie meinen Fall hat, aber es ist in Python, und ich habe es in C#

How can we figure out why certain uuencoded files are not decoding properly using Python?

Hier ein Beispiel für eine txt-Datei ist, die ein eingebettetes hatte uuencoded pdf, die sich mit Ausgabe: https://www.sec.gov/Archives/edgar/data/1631661/000163166116000004/0001631661-16-000004.txt

Mein uuDecoder Algorithmus-Code ist genau diesem ähnlich ist: http://blog.stevex.net/2004/04/c-classes-to-decode-yenc-and-uuencode-encoded-usenet-binaries/

Ich fand heraus, dass es Index im folgenden Code außerhalb der Reichweite Ausnahme wirft, wo es 61 Zeichen in einer Zeile erwartet, aber einige der Linien nicht exakt 61 chacters:

public static byte[] uuDecode(string buffer) 
     { 
      // Create an output array 
      byte[] outBuffer = new byte[(buffer.Length-1)/4*3]; 
      int outIdx = 0; 

      // Get the string as an array of ASCII bytes 
      byte[] asciiBytes = Encoding.ASCII.GetBytes(buffer); 

      for (int i=0; i<asciiBytes.Length; i++) 
      { 
       asciiBytes[i] = (byte)((asciiBytes[i]-0x20) & 0x3f); 
      } 

      // Convert each block of 4 input bytes into 3 
      // output bytes 
      for (int i = 1; i <= (asciiBytes.Length-1); i += 4) 
      { 
       outBuffer[outIdx++] = (byte)(asciiBytes[i] << 2 | asciiBytes[i+1] >> 4); 
       outBuffer[outIdx++] = (byte)(asciiBytes[i+1] << 4 | asciiBytes[i+2] >> 2); 
       outBuffer[outIdx++] = (byte)(asciiBytes[i+2] << 6 | asciiBytes[i+3]); 
      } 

      return outBuffer; 
     } 

Bitte beachten Sie, dass nicht alles ist im Zusammenhang mit "Index außerhalb des Bereichs" Ausnahme hier also bitte nicht umleiten dorthin.

Ich habe versucht, wie unten fehlenden Zeichen mit Leerzeichen zu füllen:

if (line.Length < 61) ////Making sure length is 61 characters 
       { 
        var builder = new StringBuilder(); 
        builder.Append(line); 
        var missing = 61 - line.Length; 

        for (int i = 0; i < missing; i++) 
        { 
         builder.Append(" "); 
        } 

        line = builder.ToString(); 

       } 

Kann mir jemand bitte helfen zu bekommen, warum dies nicht für einige PDF-Dokument arbeitet?

+0

Veröffentlichen Sie den Code und ein Beispiel, das das Problem reproduziert. "Fast gleich" bedeutet, dass es keine Möglichkeit gibt, Fehler zu finden, die durch die Unterschiede verursacht werden. –

+0

Es ist genau derselbe Algorithmus, jetzt, wenn er Ihre Bedenken beantwortet @PanagiotisKanavos – Neel

+0

Ist es wert, ganzen Algorithmus hier @PanagiotisKanavos zu setzen? – Neel

Antwort

1

Ich denke, das Problem ist in Leerzeichen. Verbesserte uuEncode verwendet `` (Code 0x60) anstelle von Leerzeichen (0x20), die getrimmt werden können. Versuchen Sie, alle Zeilen rechts auf voller Größe zu puffern. Versuchen Sie, diese Umwandlung (pdf.uue ist der UUEncoded Teil der Datei - von begin bis end):

 string[] all = File.ReadAllLines(@"d:\tmp\pdf.uue"); 
     for (int i = 1; i < all.Length - 2; i++) 
     { 
      if (all[i].Length < 61) 
       all[i] = all[i].PadRight(61, ' '); 
     } 
     File.WriteAllLines(@"d:\tmp\pdf-2.uue", all); 

Die Schleife 1 .. Length-2 überspringen ist, zu Beginn/Ende-Linien.

+0

Ich bekomme Sie nicht können Sie bitte erklären mehr – Neel

+0

@Neel Testen Sie mein Beispiel. Ich benutzte WinRar, um den ursprünglichen uuencoded Teil zu kodieren und resultierende PDFs waren falsch. Nach der Reparatur scheinen sie in Ordnung zu sein. – i486

+0

Ich vermute, Sie haben die restlichen fehlenden Zeichen mit Leerzeichen ausgefüllt? – Neel

Verwandte Themen