바이너리 처리를위한 쉘 같은 환경


15

이 질문은 이제 질문에 대한 응답으로, 몇 번 전에 나에게 온 강타의 표준 입력에서 이진 데이터 청크를 통해 루프 에 주어진 답변 /programming/993434/what-language-is-to-binary -per-as-is-to-text 도 만족스럽지 않았습니다.

바이너리 파일로 I / O를 처리하기에 적합한 스크립팅 환경을 찾고 있습니다. 나는 완전한 프로그래밍 언어 중 하나 (c / Python / ...) 중 하나를 사용할 수 있지만 엄청난 초기화 및 코딩 오버 헤드 (c의 할당 및 fread / fwrite, Python의 비트 문자열 ...)는 말할 것도 없습니다. 그것들은 스크립팅에 적합하지 않습니다 (다른 응용 프로그램을 호출). Perl은 unpack함수, 문자열 지향 연산 및 구피 구문으로 더 나을 수 없습니다 .

od언어 와 같은 것 입니다.

내가 기대하는 것 :

  1. 단일 스위치 / 명령으로 엔디안 설정 또는 변경
  2. 요구 된 형태의 간단한 규격 (떠들썩한 파티 같은 연장 read var으로 int32 var, float var등).
  3. 파이프를 통한 이진 처리, 지정된 바이트 수 건너 뛰기
  4. 우리가 사용하는 표준 스크립팅 흐름 제어 (for / if / ...).

ASCII 파일을 검사 할 때 얻을 수있는 것과 같은 쉽고 통찰력으로 원시 데이터 (사진, 과학 데이터, 알 수없는 문서 및 형식이 잘못된 형식)를 처리하고 싶습니다. 지금 사용 c하고 있지만 임시 스크립팅에는 적합하지 않으며 대화식으로 사용할 수 없습니다.

누구든지 그런 도구를 알고 있습니까? clicky GUI 소프트웨어가 없으므로 ssh를 통해 다른 스크립트 등에서 작동해야합니다. "존재하지 않음"은 수용 가능하지만 우울한 대답입니다.


2
시작 시간의 고통을 제거하지는 않지만 Python 3.3의 바이트와 plumbum이 매우 실행 가능 chain = ls["-a"] | grep["-v", "\\.py"] | wc["-l"]; chain()하다는 것을 알았습니다 .
Anthon

현재 가지고있는 C 코드를 가져 와서 bash 스크립트에서 사용할 수있는 일련의 명령 줄 도구로 바꿀 수 있습니다. 바이너리를 쉘 변수에 넣을 수는 없지만 명명 된 ( 'fifo') 파이프에이를 숨길 수 있습니다. 내용은 읽을 때까지 메모리에 저장됩니다.
goldilocks

1
당신의 추론 WRT 파이썬과 펄, BTW에 심각한 결함이 있습니다. 개별 명령 행 도구가 컴파일되는 동안 쉘 스크립트는 그리 많지 않으며 많은 포크 작업이 필요합니다 (비용이 많이 드는 경우 포크 작업). 토론, 다른 질문 등은 바이너리를 처리 할 수 ​​있다면 bash를 사용하는 것이 좋습니다. 파이썬과 펄 스크립트는 모두 미리 컴파일되어 있습니다. 복잡한 python 또는 perl 스크립트와 병렬 bash 스크립트를 벤치마킹하면 perl 또는 python이 훨씬 빠릅니다 . 당신이 나를 믿지 않는다면, 당신은 반대로 증거를 웹에서 검색하는 것을 환영합니다.
goldilocks

나는 빨리 실행되는 도구를 찾고 있지 않고, 빨리 코딩 할 수있는 것을 찾고있다 . 예를 들어, 그 뒤에 오는 구조체 (int, float, float)의 배열 크기에 대해 바이너리 int를 출력하는 이상한 프로그램이 있다면 배열 크기를 빠르게 읽고 배열을 반복하여 일부를 계산하고 싶습니다. 일부 구성 요소의 누적 또는 최대 값 또는 gnuplot 처리를 위해 하나의 구성 요소를 ASCII 열로 인쇄하십시오. Anthon : 고마워요, 나는 이것에 대해 몰랐습니다, 그것은 유용 할 것입니다. goldilocks : 나는 그것을 피하려고 노력하고있다. 그러나 나는 단지 끝에 나의 자신의 도구를 쓸지도 모른다 :)
orion

2
당신 같은 사운드는 사용하는 방법에 대한 자습서가 필요 perlS ' unpack(ᵔᴥᵔ)
스테판 Chazelas가

답변:


2

몇 년 동안 당신과 똑같은 문제가 있습니다.

간단한 비대화 형 사용을 위해 바이너리 블록 편집기 BBE 를 사용하고 싶습니다 . BED는 SED가 전형적인 구문과 단순성을 포함하여 텍스트에 대한 것처럼 바이너리이지만, 종종 필요한 것에서 누락 된 많은 기능이 있으므로 다른 도구와 결합해야합니다. 따라서 BBE는 부분 솔루션 일뿐입니다. 또한 BBE는 수년간 업데이트 나 개선 사항이 없었습니다.

물론 텍스트 기반 도구를 사용하여 데이터를 편집 xxd하기 전후에 사용할 수 xxd -r있지만 문제가되는 데이터가 크고 블록 장치를 처리 할 때와 같이 임의 액세스가 필요한 경우에는 작동하지 않습니다.

(참고 : Windows의 경우 적어도 비용이 많이 드는 독점적 WinHex 스크립팅 언어가 있지만 어느 곳에서도 우리를 얻을 수는 없습니다.)

더 복잡한 이진 편집의 경우, 큰 파일의 경우 너무 느리지 만 주로 주요 단점 인 파이썬으로 대체됩니다. 나는 희망 Pyston은 (파이썬은 최적화 된 머신 코드로 컴파일 LLVM을 사용) 언젠가, 누군가가 AFAIK가 존재하지 않는, 빠르고 바이너리 처리 스크립트 언어 다목적, 무료 컴팩트를 설계하고 구현하는 것입니다 더 나은 사용 가능, 또는 수있을 정도로 성숙합니다 시스템과 비슷한 U * IX.

최신 정보

또한 홈 브루, 오픈 소스 Intel x86 어셈블러 플랫 어셈블러 또는 간단히 말해서 fasm을 사용하여 어셈블러 그 이상으로 발전했습니다.

볼랜드 터보 어셈블러 매크로 언어의 전통에 대한 구문을 갖춘 강력한 텍스트 블록 기반 매크로 전 처리기 (투어링 완전한 언어)를 가지고 있지만 훨씬 더 고급입니다.

또한 데이터 조작 언어를 사용하여 임의의 파일을 2 진으로 포함하고 "컴파일 시간"에서 모든 종류의 2 진 및 산술 조작 (정수만)을 수행하고 결과를 출력 파일에 쓸 수 있습니다. 이 데이터 조작 언어에는 제어 구조가 있으며 튜링 완료입니다.

C로, 심지어 파이썬으로 바이너리를 조작하는 프로그램을 작성하는 것보다 사용하기가 훨씬 쉽습니다. 또한 외부 의존성이 거의없는 작은 크기의 실행 파일이기 때문에 맹목적으로 빠르게로드됩니다 (libc 만 필요하거나 Linux 커널 ABI에서 직접 정적 실행 파일로 실행할 수있는 두 가지 버전이 있습니다).

여기에는 약간의 멍이 있습니다.

  1. 동시성을 지원하지 않음

  2. 32 비트 x86 어셈블리 (x86_64에서 작동)로 작성 중이므로 x86 또는 x86_64 이외의 다른 곳에서 실행하려면 qemu 또는 유사한 에뮬레이터가 필요할 것입니다

  3. 강력한 매크로 전 처리기 언어가 완성되었습니다. 따라서 Lisp, Haskell, XSLT 또는 M4와 같은 언어에 대한 경험이 더 좋습니다.

  4. 출력 파일에 기록 될 모든 데이터는 메모리의 "플랫 (flat)"버퍼에서 수행되며이 버퍼는 커질 수 있지만 출력 파일이 기록되고 fasm이 종료 될 때까지 줄어들지 않습니다. 즉, 한 번의 fasm 실행에 주 메모리가 남아있는 한 최대 크기의 파일 만 생성 할 수 있습니다.

  5. 각 fasm 실행마다 데이터를 단일 출력 파일에만 쓸 수 있습니다

  6. 그래, 그것은 사제, 정말 깔끔하고 영리한 것입니다


2

펄의 압축 풀기로 반드시 "평화"를 만들 필요는 없습니다. 펄의 가장 큰 장점 중 하나는 파서와 심볼 테이블을 남용하여 커스텀 패키지로 자신의 언어를 만드는 방법입니다.

이것이 기본적으로 당신이 찾고있는 것입니까?

use MyBinLib;
my $struct= struct(
  pack => 8,
  size => 400,
  fields => [int32('foo','bar','baz'), float32('x1','x2','x3','x4'), int8, int8, int16('z')]
);
while (my $rec= $struct->read(<STDIN>)) {
  printf "x1 = %d, x2 = $d\n", $rec->x1, $rec->x2;
}

그런 다음 MyBinLib 패키지를 작성하기에 충분한 펄을 배웁니다. Perl 포럼에 문의하면 사람들이 기꺼이 도와 줄 것입니다.


1

당신이 건너 가지고 beav, 그것은 매크로를 가지고 있지만, 스크립트를 찾을 수 없습니다

apt-cache show beav 추출 :

beav를 사용하면 HEX, ASCII, EBCDIC, OCTAL, DECIMAL 및 BINARY로 파일을 편집 할 수 있습니다. FLOAT 모드에서는 데이터를 표시 할 수 있지만 편집 할 수는 없습니다. 이 모드 중 하나에서 검색 또는 검색하고 바꿀 수 있습니다. BYTE, WORD 또는 DOUBLE WORD 형식으로 데이터를 표시 할 수 있습니다. WORDS 또는 DOUBLE WORDS를 표시하는 동안 데이터는 INTEL 또는 MOTOROLA의 바이트 순서로 표시 될 수 있습니다. 모든 길이의 데이터는 파일의 어느 시점 에나 삽입 할 수 있습니다. 이 데이터의 소스는 키보드, 다른 버퍼 또는 파일 일 수 있습니다. 표시되는 모든 데이터를 표시된 형식으로 프린터로 보낼 수 있습니다. 메모리보다 큰 파일을 처리 할 수 ​​있습니다.

그리고 거기에 xxd함께 결합 될 수있는 이진 / 아스키 표시 모드에서 /에있는 변환과 sedvi,하지만 기능을 교환 바이트를 가지고 않았습니다.


0

당신은 항상 금을 찾아 C 또는 ASM으로 떨어질 수 있습니다. 원시 바이너리로 작업하는 경우 레지스터에서 바로 바운스하십시오. 당신은 '이미 있습니다'.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.