某些uuEncoded文件在C#中无法正确解码

时间:2016-06-01 14:07:02

标签: c#

我正在获取一个SGML文件,我使用uuDecoder从中提取数据,然后用它创建PDF。

多年以来一切正常,但是从最近几个月开始,我们观察到一些PDF文件无法加载,并且在Chrome中显示“无法加载PDF文档”。

我已经完成了下面的问题,这个问题与我的情况类似,但它是在Python中我在c#中有它#

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

以下是具有嵌入式uuencoded pdf的txt文件的示例: https://www.sec.gov/Archives/edgar/data/1631661/000163166116000004/0001631661-16-000004.txt

我的uuDecoder算法代码与此完全相似: http://blog.stevex.net/2004/04/c-classes-to-decode-yenc-and-uuencode-encoded-usenet-binaries/

我发现它在下面的代码中抛出了索引超出范围的异常,它在一行中需要61个字符,但有些行没有准确的61个字符:

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

请注意,此处没有任何与“索引超出范围”例外相关的内容,因此请不要将其重定向到那里。

我尝试用空格填充缺少的字符,如下所示:

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

                }

有人可以帮助我解释为什么这不适用于少量PDF文档?

1 个答案:

答案 0 :(得分:2)

我认为问题出在空间。改进的uuEncode使用``(代码0x60)代替空格(0x20),可以修剪。尝试将所有线条填充到正确的全尺寸。试试这个转换(pdf.uue是文件的uuencoded部分 - 从beginend):

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

循环为1 .. Length-2以跳过开始/结束行。