试图确定文件是不是已被 uuencoded

Posted

技术标签:

【中文标题】试图确定文件是不是已被 uuencoded【英文标题】:Trying to determine if file has been uuencoded试图确定文件是否已被 uuencoded 【发布时间】:2011-06-07 11:13:33 【问题描述】:

我正在尝试处理大量 txt 文件,这些文件本身就是我要处理的实际文件的容器。 txt 文件具有 sgml 标记,这些标记为我正在处理的各个文件设置边界。有时,包含的文件是经过 uuencoded 的二进制文件。我已经解决了解码 uuencoded 文件的问题,但是当我在考虑我的解决方案时,我确定它不够通用。也就是我一直在用

if '\nbegin 644 ' in document['document']

测试文件是否被uuencoded。我做了一些搜索,对 644 的含义(文件权限)有一个模糊的理解,然后发现了其他可能具有

的 uuencoded 文件示例
if '\nbegin 642 ' in document['document']

甚至是其他一些替代品。因此,我的问题是如何确保捕获/识别所有具有 uuencoded 文件的子容器。

一种解决方案是测试每个子容器:

uudecode=codecs.getdecoder("uu")

for document in documents:
    try:
        decoded_document,m=uudecode(document)
    except ValueError:
         decoded_document=''
    if len(decoded_document)==0
        more stuff

这并不可怕,cpu 周期很便宜,但我将处理大约 800 万个文档。

那么,有没有更稳健的方法来识别特定字符串是否是 uuencoding 的结果?

【问题讨论】:

【参考方案1】:

Wikipedia says每个uuencoded文件都以这一行开头

begin <perm> <name>

因此,与正则表达式 ^begin [0-7]3 (.*)$ 匹配的行可能足够可靠地表示开头。

【讨论】:

我很欣赏这个想法。我担心我没有得到太多,而不是尝试解码文件,因为我必须运行正则表达式。 编译的正则表达式匹配(或失败)非常快。也许 uudecode 失败的速度很快,并且已经包含了这一步。唯一确定的方法是在 2-3 千个文件上实际试用它并测量哪个更快。 请注意,文件不必以 'begin' 开头 - 大多数现代 uudecodes 会忽略第一次开始之前的任何内容 - 这可能是为了让您可以将邮件直接通过管道传输到其中,而不必过滤掉标题。【参考方案2】:

两种方式:

(1) 在基于 Unix 的系统上,您可以稳健地使用 file 命令。

http://unixhelp.ed.ac.uk/CGI/man-cgi?file

$ file foo
foo: uuencoded or xxencoded text

(2) 我还发现了以下(未经测试的)Python 代码,看起来可以满足您的需求(http://ubuntuforums.org/archive/index.php/t-1304548.html)。

#!/usr/bin/env python
import magic
import sys
filename=sys.argv[1]
ms = magic.open(magic.MAGIC_NONE)
ms.load()
ftype = ms.file(filename)
print ftype
ms.close()

【讨论】:

除了在“开始”之前有内容的文件 - 大多数 uudecoders 会跳过。 “文件”可能会将这些报告为 Ascii 文本。没关系你在 Windows 上,安装 Cygwin,然后你就可以拥有所有的 Unix 好东西。

以上是关于试图确定文件是不是已被 uuencoded的主要内容,如果未能解决你的问题,请参考以下文章

确定本地通知是不是已被明确拒绝

RxSwift - 确定 Observable 是不是已被释放

如何确定 UIViewController 是不是已被称为 ModalDialog?

如何确定单选按钮是不是已被选中?

您试图在一个本应是不可变且已被冻结的对象上设置密钥

如何以编程方式确定是不是已安装 ActiveX 控件,以及它或整个 ActiveX 是不是已被禁用?