2

そこで、最初にマジック ナンバー/ファイル署名を調べて、あいまいな拡張子を持つファイルを Windows で起動する短い Python スクリプトを作成しました。

関連付けを簡単にするために .exe にコンパイルしたいのですが (bbfreeze を使用するか、C で書き直してください)、一致するバイト文字列とプログラム パスを指定するには、ある種のユーザー フレンドリーな構成ファイルが必要です。基本的に、この情報を何らかの形でプレーンテキストファイルに入れたいと思っています:

magic_numbers = {
# TINA
'OBSS': r'%PROGRAMFILES(X86)%\DesignSoft\Tina 9 - TI\TINA.EXE',

# PSpice
'*version': r'%PROGRAMFILES(X86)%\Orcad\Capture\Capture.exe', 
'x100\x88\xce\xcf\xcfOrCAD ': '', #PSpice?

# Protel
'DProtel': r'%PROGRAMFILES(X86)%\Altium Designer S09 Viewer\dxp.exe', 

# Eagle
'\x10\x80': r'%PROGRAMFILES(X86)%\EAGLE-5.11.0\bin\eagle.exe',
'\x10\x00': r'%PROGRAMFILES(X86)%\EAGLE-5.11.0\bin\eagle.exe',
'<?xml version="1.0" encoding="utf-8"?>\n<!DOCTYPE eagle ': r'%PROGRAMFILES(X86)%\EAGLE-5.11.0\bin\eagle.exe',

# PADS Logic
'\x00\xFE': r'C:\MentorGraphics\9.3PADS\SDD_HOME\Programs\powerlogic.exe', 
}

(16 進バイトは、Unicode 文字ではなく、単なる任意のバイトです。)

この形式の .py ファイルは機能すると思いますが、コンパイルされていないままにして、何らかの形でコンパイル済みファイルにインポートする必要があり{ます,

私は YAML を調べましたが、最初に base64 エンコードのバイナリーを必要とすることを除けば素晴らしいと思いますが、これは私が本当に望んでいるものではありません。構成ファイルにバイトの 16 進表現を含めることをお勧めします。しかし、それがすべてのファイル署名である場合は、ASCII表現も。そして多分また正規表現。:D (たとえば、XML ベースの形式をさまざまな量の空白で記述できる場合)

何か案は?

4

3 に答える 3

1

あなたはすでにあなたの答えを持っています:YAML。

上記で投稿したデータは、バイナリデータのテキスト表現を保存しています。これはYAMLには問題ありませんが、適切に解析する必要があります。通常、binasciiモジュールの何かを使用します。この場合、おそらくbinascii.a2b_qp関数です。

magic_id_str = 'x100\x88\xce\xcf\xcfOrCAD '
magic_id = binascii.a2b_qp(magic_id_str)

解明するために、バイナリデータをREPL(Python 2.7)に貼り付ける簡単な方法としてUnicode文字を使用します。

>>> a = 'Φ'  
>>> a  
'\xce\xa6'  
>>> 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'])  
'\xce\xa6'  
于 2012-03-13T17:41:37.167 に答える
1

これを少し違う方法で行うことをお勧めします。これら 2 つの設定を互いに分離します。

  1. マジックナンバー署名 ===> MIME タイプ
  2. mimetype ==> プログラムランチャー

最初の部分では、libmagicへのバインディングを持つライブラリであるpython-magicを使用します。次のようなカスタム マジック ファイルを python-magic に使用させることができます。

import magic
m = magic.Magic(magic_file='/path/to/magic.file')

ユーザーは、マジック ナンバーを MIME タイプにマッピングするカスタム マジック ファイルを指定できます。マジック ファイルの構文は文書化されています。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          MM\x00\x2a      TIFF image data, big-endian
!:mime  image/tiff
0       string          II\x2a\x00      TIFF image data, little-endian
!:mime  image/tiff

2 番目の部分は、テキスト データを指定するだけでよいため、非常に簡単です。他の人が提案しているように、INIまたはyaml形式を使用することも、次のような単純なタブ区切りファイルを使用することもできます。

image/tiff         C:\Program Files\imageviewer.exe
application/json   C:\Program Files\notepad.exe
于 2012-03-13T20:12:29.030 に答える
-1

いくつかのパッケージを使用して、構成ファイルと yaml を作成しました。ConfigParser または ConfigObj を使用することをお勧めします。

最後に、最良のオプション コメント付きで人間が読める構成ファイルを作成したい場合は、ConfigObj を使用することを強くお勧めします。

楽しみ!

ConfigObj の例

このコードで:

ConfigObj を使用してそれらを保存することもできます。これを試してください: import 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
于 2012-03-13T16:30:45.577 に答える