Một môi trường giống như vỏ để xử lý nhị phân


15

Câu hỏi này đã đến với tôi một vài lần trước đây, bây giờ để trả lời câu hỏi Lặp qua các đoạn dữ liệu nhị phân từ stdin trong Bash Câu trả lời được đưa ra trong /programming/993434/what-lingu-is-to-binary -as-perl-is-to-text cũng không thỏa đáng.

Tôi đang tìm kiếm một môi trường tập lệnh phù hợp đặc biệt để xử lý I / O với các tệp nhị phân. Tôi biết rằng tôi có thể sử dụng một trong những ngôn ngữ lập trình chính thức (c / Python / ...) nhưng chúng có khả năng khởi tạo và mã hóa rất lớn (cấp phát và fread / fwrite trong c, bitstrings trong Python ...) không đề cập đến chúng không phù hợp để viết kịch bản (gọi các ứng dụng khác từ nó). Perl không tốt hơn với các unpackchức năng của nó , hoạt động theo định hướng chuỗi và cú pháp ngớ ngẩn.

Một cái gì đó như od, nhưng như một ngôn ngữ.

Những gì tôi mong đợi:

  1. thiết lập hoặc thay đổi tuổi thọ với một công tắc / lệnh duy nhất.
  2. đặc điểm kỹ thuật đơn giản của loại được yêu cầu (một cái gì đó như mở rộng bash read varvới int32 var, float varv.v.).
  3. xử lý nhị phân thông qua các đường ống, bỏ qua số byte được chỉ định.
  4. điều khiển luồng kịch bản tiêu chuẩn (cho / if / ...) mà chúng ta đã quen.

Tôi muốn xử lý dữ liệu thô (chụp ảnh, dữ liệu khoa học, các định dạng tài liệu kém và không rõ ràng) với cùng một cách dễ dàng và hiểu biết mà bạn có được khi kiểm tra các tệp ASCII. Hiện tôi đang sử dụng c, nhưng nó không tối ưu cho kịch bản đặc biệt và không thể tương tác.

Có ai biết một công cụ như vậy không? Không có phần mềm GUI clicky, xin vui lòng, nó cần phải hoạt động trên ssh, từ các tập lệnh khác, v.v. "Không tồn tại" là một câu trả lời chấp nhận được, nhưng buồn.


2
Nó không làm giảm bớt nỗi đau của thời gian khởi động, nhưng tôi thấy các byte từ Python 3.3, cùng với plumbum rất khả thi: chain = ls["-a"] | grep["-v", "\\.py"] | wc["-l"]; chain()Bạn đã xem xét điều đó chưa?
Anthon

Bạn có thể lấy mã C mà bạn có bây giờ và biến nó thành một bộ công cụ dòng lệnh bạn có thể sử dụng trong tập lệnh bash. Trong khi bạn không thể đặt nhị phân vào một biến shell, bạn có thể bỏ nó vào các ống có tên ('fifo'); nội dung của chúng được giữ trong bộ nhớ cho đến khi bạn muốn đọc chúng.
goldilocks

1
Có một lỗ hổng nghiêm trọng trong lý luận của bạn về con trăn WRT và perl, BTW. Trong khi các công cụ dòng lệnh riêng lẻ được biên dịch, các tập lệnh shell không và liên quan đến việc rèn nhiều (nếu bạn muốn đắt tiền, thì việc đó là rất khó). Thảo luận của bạn, câu hỏi khác, v.v., ngụ ý rằng bạn sẽ ổn với việc sử dụng bash ở đây nếu nó có thể xử lý nhị phân. Python và các kịch bản perl là cả tiền biên dịch. Nếu bạn điểm chuẩn một tập lệnh python hoặc perl khá phức tạp so với tập lệnh bash song song, perl hoặc python sẽ là một thứ tự có độ lớn nhanh hơn . Nếu bạn không tin tôi, bạn có thể tìm kiếm trên web để tìm bằng chứng ngược lại.
goldilocks

Tôi không tìm kiếm một công cụ chạy nhanh, tôi đang tìm thứ gì đó tôi có thể viết mã nhanh. Chẳng hạn, nếu tôi có một chương trình lạ tạo ra một int nhị phân cho kích thước mảng của structs (int, float, float) theo sau nó, tôi muốn đọc nhanh kích thước mảng và lặp qua mảng, có thể tính toán một số tích lũy hoặc tối đa của một số thành phần, hoặc chỉ in một thành phần dưới dạng cột ascii để xử lý gnuplot. Anthon: cảm ơn bạn, tôi không biết về điều này, nó sẽ hữu ích. goldilocks: Tôi đang cố gắng tránh điều đó nhưng cuối cùng tôi chỉ có thể viết công cụ của riêng mình :)
orion

2
Âm thanh như bạn cần một hướng dẫn về cách sử dụng perl's unpack(ᵔᴥᵔ)
Stéphane Chazelas

Câu trả lời:


2

Tôi cũng có cùng một vấn đề so với bạn trong nhiều năm.

Đối với việc sử dụng không tương tác đơn giản, tôi thích sử dụng trình soạn thảo khối nhị phân BBE . BBE là nhị phân vì SED là văn bản, bao gồm cú pháp cổ xưa và đơn giản của nó, tuy nhiên, nó có rất nhiều tính năng thiếu từ những gì tôi thường cần, vì vậy tôi phải kết hợp nó với các công cụ khác. Vì vậy, BBE chỉ là một giải pháp một phần. Cũng lưu ý rằng BBE đã không có bất kỳ cập nhật hoặc cải tiến nào trong nhiều năm.

Tất nhiên người ta có thể sử dụng xxdtrước và xxd -rsau khi chỉnh sửa dữ liệu bằng các công cụ dựa trên văn bản, nhưng điều đó sẽ không hoạt động khi dữ liệu được đề cập là lớn và cần có quyền truy cập ngẫu nhiên, ví dụ như khi xử lý các thiết bị khối.

(Lưu ý: Đối với Windows, ít nhất có ngôn ngữ kịch bản WinHex độc quyền, tốn kém, nhưng điều đó sẽ không đưa chúng ta đến bất cứ đâu.)

Để chỉnh sửa nhị phân phức tạp hơn, tôi cũng thường quay lại Python, mặc dù đôi khi nó quá chậm đối với các tệp lớn, đó là nhược điểm chính. Tôi hy vọng Pyston (Python sử dụng LLVM để biên dịch mã máy được tối ưu hóa) một ngày nào đó đủ trưởng thành để có thể sử dụng được, hoặc thậm chí tốt hơn, ai đó sẽ thiết kế và thực hiện một ngôn ngữ kịch bản xử lý nhị phân nhỏ gọn, nhanh chóng và linh hoạt, mà AFAIK không tồn tại U * IX giống như các hệ thống chưa.

CẬP NHẬT

Tôi cũng tình cờ sử dụng trình biên dịch chương trình lắp ráp phẳng Intel x86 mã nguồn mở , hay gọi tắt là fasm, phát triển thành nhiều hơn là một trình biên dịch.

Nó có một bộ tiền xử lý macro dựa trên nền tảng văn bản mạnh mẽ (bản thân nó là một ngôn ngữ hoàn chỉnh) với một cú pháp theo truyền thống của ngôn ngữ macro trình biên dịch chương trình borland turbo, nhưng tiên tiến hơn nhiều.

Ngoài ra, nó có ngôn ngữ thao tác dữ liệu, cho phép nhị phân bao gồm các tệp tùy ý, thực hiện tất cả các loại thao tác nhị phân và số học trên đó (chỉ số nguyên) tại "thời gian biên dịch" và ghi kết quả vào tệp đầu ra. Ngôn ngữ thao tác dữ liệu này có các cấu trúc điều khiển và cũng hoàn tất.

Nó dễ sử dụng hơn nhiều so với việc viết một chương trình thực hiện một số thao tác nhị phân trong C và thậm chí có thể bằng python. Thêm vào đó, nó tải rất nhanh, vì nó là một tệp thực thi có kích thước nhỏ mà hầu như không có phụ thuộc bên ngoài (Có 2 phiên bản: hoặc chỉ yêu cầu libc hoặc nó có thể chạy dưới dạng thực thi tĩnh trực tiếp trên nhân Linux ABI).

Nó có một số cạnh xù, như

  1. không hỗ trợ đồng thời

  2. đang viết trong hội đồng x86 32 bit (hoạt động trên x86_64), bạn có thể cần qemu hoặc trình giả lập tương tự nếu bạn muốn chạy nó trên bất kỳ thứ gì khác ngoài x86 hoặc x86_64

  3. ngôn ngữ tiền xử lý macro mạnh mẽ của nó đã hoàn tất, điều này có nghĩa là bạn nên có một số kinh nghiệm với các ngôn ngữ như Lisp, Haskell, XSLT hoặc có lẽ M4 sẽ là lựa chọn tốt nhất.

  4. tất cả dữ liệu được ghi vào tệp đầu ra được thực hiện trong bộ đệm "phẳng" trong bộ nhớ và bộ đệm này có thể phát triển nhưng không co lại cho đến khi tệp đầu ra được ghi và kết thúc. Điều này có nghĩa là người ta chỉ có thể tạo các tệp lớn nhất bằng số lượng bộ nhớ chính còn lại trong một lần chạy.

  5. dữ liệu chỉ có thể được ghi vào một tệp đầu ra cho mỗi lần chạy fasm

  6. Vâng, đó là homebrew, một người thực sự gọn gàng và thông minh


2

Bạn không nhất thiết phải "làm hòa" với việc giải nén của Perl ... một trong những điều tuyệt vời về perl là cách bạn có thể lạm dụng trình phân tích cú pháp và bảng biểu tượng để tạo ngôn ngữ của riêng bạn, trong một gói tùy chỉnh.

Đây có phải là những gì bạn đang tìm kiếm?

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;
}

Bài tập sau đó là học đủ perl để viết gói MyBinLib. Hỏi trong một diễn đàn Perl và mọi người có thể sẽ vui lòng giúp đỡ.


1

Bạn đã đi qua beavnó có macro nhưng tôi không thể tìm thấy kịch bản,

apt-cache show beav trích xuất :

Với beav, bạn có thể chỉnh sửa một tệp trong HEX, ASCII, EBCDIC, OCTAL, DECIMAL và BINary. Bạn có thể hiển thị nhưng không chỉnh sửa dữ liệu trong chế độ FLOAT. Bạn có thể tìm kiếm hoặc tìm kiếm và thay thế trong bất kỳ chế độ nào. Dữ liệu có thể được hiển thị ở các định dạng BYTE, WORD hoặc NHÂN ĐÔI. Trong khi hiển thị WORDS hoặc NHÂN ĐÔI, dữ liệu có thể được hiển thị theo thứ tự byte của INTEL hoặc của Frankfurt. Dữ liệu có độ dài bất kỳ có thể được chèn tại bất kỳ điểm nào trong tệp. Nguồn của dữ liệu này có thể là bàn phím, bộ đệm khác hoặc tệp. Bất kỳ dữ liệu nào đang được hiển thị có thể được gửi đến máy in ở định dạng được hiển thị. Các tập tin lớn hơn bộ nhớ có thể được xử lý.

Sau đó, có xxdchuyển đổi sang / từ chế độ hiển thị nhị phân / ascii và có thể được kết hợp cùng với sedhoặc vi, nhưng không có tính năng hoán đổi byte.


0

Bạn luôn có thể lấy vàng và thả xuống C hoặc ASM. Nếu bạn đang làm việc với nhị phân thô, chỉ cần thoát nó ra khỏi thanh ghi. Bạn đã "ở đó".

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.