如何找出某些uuencoded文件在Python中无法正确解码的原因?

2 投票
3 回答
1734 浏览
提问于 2025-04-16 22:40

我们正在尝试解码一些嵌入在文本文件中的uu编码PDF文件。

我们遇到的问题是,大部分PDF文件用Python的uuencode库解码后都没问题。这里是相关的代码:

try:
    decoded_file,m=uudecode(fileString)
except:
    decoded_file=''

但是,有些文件在解码后无法打开。我们收到的提示是“打开此文档时出错。文件已损坏,无法修复。”

我们在谷歌上找到的唯一信息是,我们的文件可能是用base64编码的,而Python的uuencoding模块只支持base32。有没有办法判断它是用base64还是base32编码的呢?

这是一个成功解码的包含嵌入uu编码PDF的文本文件示例: http://www.sec.gov/Archives/edgar/data/1108046/000000000011020832/0000000000-11-020832.txt

这是一个解码失败的示例: http://www.sec.gov/Archives/edgar/data/914257/000000000011005978/0000000000-11-005978.txt

在用Python解码这些文件时,没有任何错误出现,一切看起来都正常。那么,是什么原因导致它们无法正确解码呢?在处理这些文件时,有没有办法标记出这个问题?

3 个回答

-1
$ python -c "import urllib2; print len(urllib2.urlopen('http://www.sec.gov/Archives/edgar/data/914257/000000000011005978/0000000000-11-005978.txt').read().decode('uu'))"
43124

运行得很好。

1

我知道我来得有点晚,但我发现了在解析这些文件中的UUEncoded文本时,至少有一个可能导致错误的原因。

我在GitHub上写了一个问题,描述了这个问题,并提供了一个合理的解决办法。看起来是Python的实现错误地假设填充字符总是空格。

下面是解决办法:

import binascii
from binascii import a2b_uu
from io import BytesIO

my_bytes = BytesIO()
line_bytes = b'..#0HQ,38-"B4E14]&#0H_'
line = line_bytes.decode(encoding='ascii')
try:
    my_bytes.write(a2b_uu(line))
except binascii.Error as err:
    if 'trailing garbage' in str(err).lower():
        n_bytes = line_bytes[0] - 32
        assert n_bytes <= 45 and n_bytes <= len(line[1:])
        workaround_line = f'M{line[1:]}'  # replace first byte of UUEncoded line with max length specifier (M)
        data = a2b_uu(workaround_line)[:n_bytes]
        print('', workaround_line, data)
        my_bytes.write(data)
    else:
        raise err

1
>>> uu.decode(open('0000000000-11-005978.txt'))
Warning: Trailing garbage

源数据本身是坏掉的。这一点可以通过在最后附近的一行开头看到的..来进一步证明。

撰写回答