문제

나는 스크립팅(또는 더 높은 수준의 프로그래밍) 언어(또는 예를 들어Python 또는 유사한 언어용 모듈)을 사용하여 파일의 바이너리 데이터를 쉽게 분석하고 조작할 수 있습니다(예:코어 덤프) Perl과 마찬가지로 텍스트 파일을 매우 원활하게 조작할 수 있습니다.

내가 하고 싶은 작업에는 임의의 데이터 청크를 다양한 형식(2진수, 10진수, 16진수)으로 표시하고, 한 엔디안에서 다른 엔디안으로 데이터를 변환하는 등이 포함됩니다.즉, 일반적으로 C 또는 어셈블리를 사용하는 작업이지만 매우 구체적이고 일회성 목적을 위해 작은 코드 조각을 매우 빠르게 작성할 수 있는 언어를 찾고 있습니다.

어떤 제안이 있으십니까?

도움이 되었습니까?

해결책

내가 하고 싶은 작업에는 임의의 데이터 청크를 다양한 형식(2진수, 10진수, 16진수)으로 표시하고, 한 엔디안에서 다른 엔디안으로 데이터를 변환하는 등이 포함됩니다.즉, 일반적으로 C 또는 어셈블리를 사용하는 작업이지만 매우 구체적이고 일회성 목적을 위해 작은 코드 조각을 매우 빠르게 작성할 수 있는 언어를 찾고 있습니다.

글쎄, 직관에 반하는 것처럼 보일 수도 있지만 얼랭 즉, 강력한 지원으로 인해 이에 매우 적합합니다. 패턴 매칭, 바이트 및 비트의 경우에도("Erlang 비트 구문").따라서 바이트 및 비트 수준에서 데이터를 검사하고 조작하는 고급 프로그램을 만드는 것이 매우 쉽습니다.

2001년부터 함수형 언어인 Erlang은 바이트 지향 데이터 유형(바이너리라고 함)과 바이너리에서 패턴 일치를 수행하는 구문을 제공합니다.

그리고 인용하자면 informIT.com:

(Erlang) 패턴 매칭은 이진 유형과 결합하면 실제로 재미가 시작됩니다.네트워크에서 패킷을 수신 한 후 처리하는 응용 프로그램을 고려하십시오.패킷의 4 바이트는 네트워크 바이트 오버 패킷 유형 식별자 일 수 있습니다.Erlang에서는이를 내부 처리를위한 데이터 구조로 변환 할 수있는 단일 프로세스 포장 기능 만 있으면됩니다.다음과 같이 보일 것입니다.

processPacket(<<1:32/big,RestOfPacket>>) ->
    % Process type one packets
    ...
;
processPacket(<<2:32/big,RestOfPacket>>) ->
    % Process type two packets
    ...

따라서 패턴 일치를 기본적으로 지원하고 기능적 언어인 erlang은 표현력이 매우 뛰어납니다. 예를 들어 erlang의 ueencode 구현을 참조하세요.

uuencode(BitStr) ->
<< (X+32):8 || <<X:6>> <= BitStr >>.
uudecode(Text) ->
<< (X-32):6 || <<X:8>> <= Text >>.

소개를 보려면 다음을 참조하세요. Erlang의 비트레벨 바이너리와 일반화된 이해.다음 사항 중 일부를 확인해 볼 수도 있습니다.

다른 팁

Perl 's 그리고 풀다 ?

파이썬 비트 스트링 이 목적을 위해 모듈이 작성되었습니다. 이진 데이터의 임의의 슬라이스를 가져갈 수 있으며 파이썬 속성을 통해 여러 가지 다른 해석을 제공합니다. 또한 이진 데이터를 구성하고 수정하기위한 많은 도구를 제공합니다.

예를 들어:

>>> from bitstring import BitArray, ConstBitStream
>>> s = BitArray('0x00cf')                           # 16 bits long
>>> print(s.hex, s.bin, s.int)                       # Some different views
00cf 0000000011001111 207
>>> s[2:5] = '0b001100001'                           # slice assignment
>>> s.replace('0b110', '0x345')                      # find and replace
2                                                    # 2 replacements made
>>> s.prepend([1])                                   # Add 1 bit to the start
>>> s.byteswap()                                     # Byte reversal
>>> ordinary_string = s.bytes                        # Back to Python string

파일에서와 마찬가지로 비트 스트링에서 비트 현저한 읽기 및 내비게이션 기능도 있습니다. 실제로 이것은 메모리로 읽지 않고 파일에서 바로 수행 할 수 있습니다.

>>> s = ConstBitStream(filename='somefile.ext')
>>> hex_code, a, b = s.readlist('hex:32, uint:7, uint:13')
>>> s.find('0x0001')         # Seek to next occurence, if found
True

또한 다른 엔디 니스가있는 견해뿐만 아니라 엔디 니스를 교환하는 능력이 있습니다. 수동.

보세요 파이썬 비트 스트링, 그것은 당신이 원하는 것과 정확히 같습니다 :)

사용 중입니다 010 편집기 이진 파일을 항상 보려면 바이너리 파일을 보려면 이진 파일을 보려면 이진 파일을 보려면 특히 이진 파일과 함께 작동하도록 준비되어 있습니다.

이진 파일을 구문 분석하고 매우 읽기 쉬운 방식으로 제시하기 위해 C와 같은 스크립팅 언어를 사용하기 쉽습니다 (나무, 색상으로 코딩 된 필드로서). zipfiles 및 bmpfiles를 구문 분석하는 몇 가지 예제 스크립트가 있습니다.

이진 파일 형식을 만들 때마다 항상 010 편집기를위한 작은 스크립트를 만들어 파일을 볼 수 있습니다. Structs가있는 헤더 파일이있는 경우 바이너리 파일 용 리더를 만드는 것은 몇 분입니다.

팩/포장 기능이 포함 된 모든 고급 프로그래밍 언어가 수행됩니다. 3 개의 perl, Python 및 Ruby가 모두 할 수 있습니다. 그것은 개인적인 취향의 문제입니다. 나는 이들 각각에 약간의 이진 구문 분석을 썼고 루비 가이 작업에서 가장 쉽고 우아하다고 느꼈습니다.

C 통역사를 사용하지 않는 이유는 무엇입니까? 나는 항상 그것들을 사용하여 스 니펫을 실험했지만, 당신은 너무 많은 문제없이 당신과 같은 것을 스크립트하기 위해 하나를 사용할 수 있습니다.

나는 항상 좋아했습니다 EIC. 죽었지 만 프로젝트는 최근에 부활되었습니다. EIC는 놀랍게도 유능하고 합리적으로 빠릅니다. 도 있습니다 고한. Cint는 Windows에서 Cygwin이 필요하다고 생각하지만 둘 다 다른 플랫폼에 대해 컴파일 될 수 있습니다.

Python의 표준 라이브러리에는 필요한 것 중 일부가 있습니다. 정렬 특히 모듈을 사용하면 이진 파일의 일부, 스왑 엔지니어 등을 쉽게 읽을 수 있습니다. 그만큼 구조 모듈은 이진 문자열의 미세한 해석을 허용합니다. 그러나 예를 들어, 바이트 또는 하프 워드와 동일한 데이터를 제시하려면 두 배열 사이에 복사해야합니다. Numpy 타사 애드온은 여러 가지 방법으로 동일한 메모리 영역을 해석하는 데 훨씬 더 강력합니다), 예를 들어, 16 진수에 일부 바이트를 표시하기 위해 간단한 루프를 넘어 "번들"은 아무것도 없습니다. [hex(b) for b in thebytes[start:stop]]. 나는 그러한 작업을 더욱 촉진하기 위해 재사용 가능한 타사 모듈이 있다고 생각하지만, 나는 당신을 하나만 지적 할 수는 없습니다 ...

Forth는 이것에 대해 꽤 능숙 할 수 있지만 약간의 비난입니다.

글쎄, 속도가 고려되지 않고 Perl을 원한다면 각 바이너리 라인을 숯의 라인 -0과 1로 변환하십시오. 예, 바이너리에는 라인 피드가 없다는 것을 알고 있습니다. :) 아마도 당신은 아마도 바이트 나 다른 장치에 의해 고정 된 크기가있을 것입니다.

그런 다음 해당 데이터의 Perl String 처리를 사용하십시오 :)

이진 수준 처리를 수행하는 경우 레벨이 매우 낮고 매우 효율적이어야하며 최소한 의존성/설치 요구 사항이 필요할 수 있습니다.

그래서 나는 c -handles bytes를 잘 가지고 갈 것입니다. 아마도 바이트를 처리하는 일부 라이브러리 패키지에 대해서는 Google에있을 수 있습니다.

Erlang과 같은 것을 가지고 가면서 비효율, 종속성 및 기타 수하물을 소개합니다.

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