因此,我制作了一个简短的Python脚本,通过首先检查它们的幻数/文件签名,在Windows中启动扩展名不明确的文件:
- https://superuser.com/a/317927/13889
- https://gist.github.com/1119561
我想把它编译成.exe,使关联更容易(使用bbfreeze或用C重写),但我需要一些用户友好的配置文件来指定匹配的字节字符串和程序路径。基本上,我想以某种方式将这些信息放入一个纯文本文件中:
magic_numbers = {
# TINA
'OBSS': r'%PROGRAMFILES(X86)%DesignSoftTina 9 - TITINA.EXE',
# PSpice
'*version': r'%PROGRAMFILES(X86)%OrcadCaptureCapture.exe',
'x100x88xcexcfxcfOrCAD ': '', #PSpice?
# Protel
'DProtel': r'%PROGRAMFILES(X86)%Altium Designer S09 Viewerdxp.exe',
# Eagle
'x10x80': r'%PROGRAMFILES(X86)%EAGLE-5.11.0bineagle.exe',
'x10x00': r'%PROGRAMFILES(X86)%EAGLE-5.11.0bineagle.exe',
'<?xml version="1.0" encoding="utf-8"?>n<!DOCTYPE eagle ': r'%PROGRAMFILES(X86)%EAGLE-5.11.0bineagle.exe',
# PADS Logic
'x00xFE': r'C:MentorGraphics9.3PADSSDD_HOMEProgramspowerlogic.exe',
}
(十六进制字节只是任意字节,而不是Unicode字符。)
我想这种格式的.py文件是有效的,但我必须让它保持未编译状态,并以某种方式将其导入已编译的文件中,而且仍然有一堆无关的内容,如{
和,
,会被混淆/搞砸。
我看了一下YAML,除了它首先需要base64编码二进制内容之外,它会很好,这不是我真正想要的。我更希望配置文件包含字节的十六进制表示。还有ASCII表示,如果文件签名就是这样的话。也许还有正则表达式。:D(例如,如果基于XML的格式可以用不同数量的空格编写)
有什么想法吗?
您已经得到了答案:YAML。
你在上面发布的数据是存储二进制数据的文本表示;这对YAML来说很好,您只需要正确地解析它。通常你会使用binascii模块中的一些东西;在这种情况下可能是binascii.a2b_qp
函数。
magic_id_str = 'x100x88xcexcfxcfOrCAD '
magic_id = binascii.a2b_qp(magic_id_str)
为了阐明,我将使用unicode字符作为将二进制数据粘贴到REPL(Python2.7)中的一种简单方法:
>>> a = 'Φ'
>>> a
'xcexa6'
>>> binascii.b2a_qp(a)
'=CE=A6'
>>> magic_text = yaml.load("""
... magic_string: '=CE=A6'
... """)
>>> magic_text
{'magic_string': '=CE=A6'}
>>> binascii.a2b_qp(magic_text['magic_string'])
'xcexa6'
我建议采取一些不同的做法。我会将这两种设置相互解耦:
- 幻数签名===>mimetype
- mimetype===>程序启动器
在第一部分中,我将使用python magic,这是一个绑定到libmagic的库。你可以让python魔术使用这样一个自定义魔术文件:
import magic
m = magic.Magic(magic_file='/path/to/magic.file')
用户可以指定一个自定义魔术文件,将魔术数字映射到mimetype。magic文件的语法有文档记录。下面是一个示例,显示TIFF格式的神奇文件:
# Tag Image File Format, from Daniel Quinlan (quinlan@yggdrasil.com)
# The second word of TIFF files is the TIFF version number, 42, which has
# never changed. The TIFF specification recommends testing for it.
0 string MMx00x2a TIFF image data, big-endian
!:mime image/tiff
0 string IIx2ax00 TIFF image data, little-endian
!:mime image/tiff
第二部分非常简单,因为现在只需要指定文本数据。按照其他人的建议,你可以使用INI或yaml格式,或者你甚至可以只使用一个简单的制表符分隔的文件:
image/tiff C:Program Filesimageviewer.exe
application/json C:Program Filesnotepad.exe
我使用了一些包来构建配置文件,还有yaml。我建议您使用ConfigParser或ConfigObj。
最后,最好的选择如果你想构建一个带有注释的可读配置文件,我强烈建议你使用ConfigObj。
- ConfigObj
- ConfigObj简介教程
- ConfigParser
- ConfigParser简要教程
享受吧!
ConfigObj示例
使用此代码:
您也可以使用ConfigObj来存储它们。试试这个:导入configobj
def createConfig(path):
config = configobj.ConfigObj()
config.filename = path
config["Sony"] = {}
config["Sony"]["product"] = "Sony PS3"
config["Sony"]["accessories"] = ['controller', 'eye', 'memory stick']
config["Sony"]["retail price"] = "$400"
config["Sony"]["binary one"]= bin(173)
config.write()
你得到这个文件:
[Sony]
product = Sony PS3
accessories = controller, eye, memory stick
retail price = $400
binary one = 0b10101101