사용자에게 친숙한 임의 바이트 문자열에 사용할 구성 파일 형식은 무엇입니까?

StackOverflow https://stackoverflow.com//questions/9687841

문제

그래서 저는 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진수 바이트는 유니코드 문자가 아닌 임의의 바이트입니다.)

이 형식의 .py 파일은 작동할 것 같지만 컴파일하지 않은 상태로 두고 어떻게든 컴파일된 파일로 가져와야 하며 다음과 같은 관련 없는 콘텐츠가 여전히 많이 있습니다. { 그리고 , 혼란스러워하다/망쳐지다.

YAML을 살펴보았는데, 먼저 base64 인코딩 바이너리 항목이 필요하다는 점을 제외하면 좋을 것입니다. 이는 실제로 제가 원하는 것이 아닙니다.나는 바이트의 16진수 표현을 포함하는 구성 파일을 선호합니다.그러나 파일 서명이 전부라면 ASCII 표현도 있습니다.그리고 정규식도 있을 수 있습니다.:D (예를 들어 XML 기반 형식을 공백의 양에 따라 다르게 작성할 수 있는 경우)

어떤 아이디어가 있나요?

도움이 되었습니까?

해결책

당신은 이미 답을 얻었습니다.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)에 바이너리 데이터를 붙여넣는 쉬운 방법으로 유니코드 문자를 사용하겠습니다.

>>> 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'  

다른 팁

이 일을 조금 다르게하는 것이 좋습니다. 나는이 두 가지 설정을 서로 분리 할 것입니다 :

  1. 마법 번호 서명===> mimetype
  2. mimetype==> 프로그램 실행기
  3. 첫 번째 부분의 경우, 나는 파이썬 마술 , 바인딩이있는 라이브러리를 사용합니다. "Nofollow"> libmagic . 파이썬 마법을 이와 같이 사용자 지정 마법 파일을 사용하실 수 있습니다 :

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

    사용자는 MIMETYPES에 맞춤형 마법 파일 매핑 마법 번호를 지정할 수 있습니다. Magic Files의 구문은 문서화 된 입니다. 다음은 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
    
    .

    이제 텍스트 데이터를 지정하면 두 번째 부분은 꽤 쉽습니다. 다른 사람들이 제안한 것처럼 INI 또는 YAML 형식으로 가거나 다음과 같이 간단한 탭으로 구분 된 파일을 가질 수 있습니다.

    image/tiff         C:\Program Files\imageviewer.exe
    application/json   C:\Program Files\notepad.exe
    
    .

구성 파일을 빌드하기 위해 일부 패키지를 사용하여 YAML을 사용했습니다.configParser 또는 configobj를 사용하는 것이 좋습니다.

마침내 주석으로 인간이 읽을 수있는 구성 파일을 작성하고 싶다면 ConfigObj를 사용하는 것이 좋습니다.

즐기십시오!

configobjj의 예

이 코드로 :

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
.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top