สภาพแวดล้อมแบบเชลล์สำหรับการประมวลผลแบบไบนารี


15

คำถามนี้มาถึงฉันสองสามครั้งก่อนตอนนี้ในการตอบสนองต่อคำถาม วนผ่านชิ้นข้อมูลไบนารีจาก stdin ใน คำตอบBashให้ใน/programming/993434/what-language-is-to-binary -as-perl-is-to-textก็ไม่พอใจเช่นกัน

ฉันกำลังมองหาสภาพแวดล้อมการเขียนสคริปต์ที่เหมาะสมโดยเฉพาะเพื่อจัดการ I / O กับไฟล์ไบนารี ฉันรู้ว่าฉันสามารถใช้หนึ่งในภาษาการเขียนโปรแกรมอย่างเต็มรูปแบบ (c / Python / ... ) แต่พวกเขามีการเริ่มต้นและการเข้ารหัสค่าใช้จ่ายมหาศาล (การจัดสรรและ fread / fwrite ใน c, bitstrings ใน Python ... ) ไม่ต้องพูดถึง มันเหมาะสำหรับการเขียนสคริปต์น้อยกว่า (เรียกแอปพลิเคชันอื่นจากมัน) Perl นั้นไม่ได้ดีไปกว่าunpackฟังก์ชั่นการใช้งานของสตริง

สิ่งที่ชอบodแต่เป็นภาษา

สิ่งที่ฉันคาดหวัง:

  1. ตั้งค่าหรือเปลี่ยน endianness ด้วยสวิตช์ / คำสั่งเดียว
  2. สเปคที่เรียบง่ายของประเภทร้องขอ (บางอย่างเช่นการขยายทุบตีread varด้วยint32 var, float varฯลฯ )
  3. การจัดการของไบนารีผ่านท่อข้ามจำนวนไบต์ที่ระบุ
  4. การควบคุมโฟลว์สคริปต์มาตรฐาน (สำหรับ / if / ... ) ที่เราคุ้นเคย

ฉันต้องการประมวลผลข้อมูลดิบ (การถ่ายภาพข้อมูลทางวิทยาศาสตร์รูปแบบที่ไม่รู้จักและไม่ดี) ด้วยความง่ายและความเข้าใจที่คุณได้รับเมื่อตรวจสอบไฟล์ ASCII ฉันใช้cอยู่ตอนนี้ แต่มันไม่เหมาะสำหรับการเขียนสคริปต์โฆษณาและไม่สามารถโต้ตอบได้

ไม่มีใครรู้ว่าเครื่องมือเช่นนั้น? ไม่มีซอฟต์แวร์ GUI clicky โปรดต้องทำงานผ่าน ssh จากสคริปต์อื่น ๆ และอื่น ๆ "ไม่มีอยู่" เป็นคำตอบที่ยอมรับได้ แต่เป็นคำตอบที่น่าหดหู่


2
มันไม่ได้ทำให้ความเจ็บปวดของเวลาเริ่มต้น แต่ฉันพบไบต์จาก Python 3.3 พร้อมกับplumbumที่ใช้งานได้ดีมาก: chain = ls["-a"] | grep["-v", "\\.py"] | wc["-l"]; chain()คุณเคยดูหรือไม่?
Anthon

คุณสามารถนำรหัส C ที่คุณมีตอนนี้และเปลี่ยนเป็นชุดเครื่องมือบรรทัดคำสั่งที่คุณสามารถใช้ในสคริปต์ทุบตี ในขณะที่คุณไม่สามารถใส่ไบนารี่ลงในตัวแปรเชลล์คุณสามารถซ่อนไว้ในท่อที่มีชื่อ เนื้อหาของพวกเขาอยู่ในความทรงจำจนกว่าคุณต้องการอ่าน
goldilocks

1
มีข้อบกพร่องร้ายแรงในการให้เหตุผล WRT python และ Perl, BTW ของคุณ ในขณะที่เครื่องมือบรรทัดคำสั่งแต่ละรายการได้รับการรวบรวมเชลล์สคริปต์จะไม่เกี่ยวข้องกับการฟอร์กมากนัก (ถ้าคุณต้องการแพงฟอร์กก็คือ) การอภิปรายคำถามอื่น ๆ ของคุณบ่งบอกว่าคุณคงสบายดีถ้าใช้ bash ที่นี่ถ้ามันสามารถจัดการไบนารีได้ งูหลามและสคริปต์ Perl มีทั้งก่อนรวบรวม หากคุณมาตรฐานหลามที่ซับซ้อนพอสมควรหรือ Perl สคริปต์กับสคริปต์ทุบตีขนาน Perl หรืองูหลามจะลำดับความสำคัญได้เร็วขึ้น หากคุณไม่เชื่อฉันคุณสามารถค้นหาเว็บเพื่อหาหลักฐานในทางตรงกันข้าม
goldilocks

ฉันไม่ได้มองหาเครื่องมือที่ทำงานได้เร็วฉันกำลังมองหาบางอย่างที่ฉันสามารถเขียนรหัสได้อย่างรวดเร็ว ตัวอย่างเช่นถ้าฉันมีโปรแกรมแปลก ๆ ที่ส่งออกเป็น int binary สำหรับขนาดอาร์เรย์ของ structs (int, float, float) ที่ตามมาหลังจากนั้นฉันต้องการอ่านขนาดอาร์เรย์และวนรอบอาร์เรย์อย่างรวดเร็วอาจคำนวณบางอย่าง สะสมหรือสูงสุดขององค์ประกอบบางส่วนหรือเพียงพิมพ์องค์ประกอบหนึ่งเป็นคอลัมน์ ascii สำหรับการประมวลผล gnuplot Anthon: ขอบคุณค่ะฉันไม่รู้เรื่องนี้มันจะมีประโยชน์ goldilocks: ฉันพยายามหลีกเลี่ยงสิ่งนั้น แต่ฉันอาจจะเขียนเครื่องมือของตัวเองในตอนท้าย :)
orion

2
ดูเหมือนคุณจะต้องมีการสอนเกี่ยวกับวิธีใช้perl's unpack(ᵔᴥᵔ)
Stéphane Chazelas

คำตอบ:


2

ฉันมีปัญหาเดียวกันแน่นอนกว่าคุณมานานหลายปีเช่นกัน

สำหรับการใช้งานที่ไม่ใช่แบบโต้ตอบง่ายฉันชอบที่จะใช้ไบนารีบล็อกบรรณาธิการBBE BBE เป็นระบบเลขฐานสองเนื่องจาก SED เป็นข้อความรวมถึงไวยากรณ์ที่เก่าแก่และความเรียบง่าย แต่มีคุณสมบัติมากมายที่ขาดหายไปจากสิ่งที่ฉันต้องการบ่อยดังนั้นฉันจึงต้องรวมเข้ากับเครื่องมืออื่น ๆ ดังนั้น BBE จึงเป็นเพียงคำตอบบางส่วน โปรดทราบด้วยว่า BBE ไม่มีการอัปเดตหรือการปรับปรุงใด ๆ เป็นเวลาหลายปี

แน่นอนหนึ่งสามารถใช้xxdก่อนและxxd -rหลังการแก้ไขข้อมูลด้วยเครื่องมือข้อความ แต่จะไม่ทำงานเมื่อข้อมูลที่เป็นปัญหามีขนาดใหญ่และจำเป็นต้องเข้าถึงแบบสุ่มเช่นเมื่อประมวลผลอุปกรณ์บล็อก

(หมายเหตุ: สำหรับ Windows มีอย่างน้อยภาษาสคริปต์ WinHex ราคาแพงที่เป็นกรรมสิทธิ์ แต่นั่นจะไม่ได้รับเราทุกที่)

สำหรับการแก้ไขไบนารีที่ซับซ้อนมากขึ้นฉันมักจะกลับไปที่ Python เช่นกันแม้ว่าบางครั้งมันจะช้าเกินไปสำหรับไฟล์ขนาดใหญ่ซึ่งเป็นข้อเสียเปรียบหลัก ฉันหวังว่าPyston (Python ใช้ LLVM เพื่อรวบรวมรหัสของเครื่องที่ดีที่สุด) สักวันหนึ่งจะโตพอที่จะใช้งานได้หรือดีกว่าบางคนจะออกแบบและใช้ภาษาสคริปต์การประมวลผลแบบไบนารีที่กะทัดรัดรวดเร็วและหลากหลายซึ่ง AFAIK ไม่มีอยู่สำหรับ U * IX ชอบระบบ

UPDATE

ฉันยังเกิดขึ้นที่จะใช้ homebrew, โอเพนซอร์ซแอสเซมเบลอร์แอสเซมเบลอร์ Intel x86 แอสเซมเบลอร์หรือสั้น ๆ ซึ่งเปลี่ยนไปเป็นมากกว่าแอสเซมเบลอร์

มีตัวประมวลผลก่อนแมโครที่มีประสิทธิภาพและใช้ตัวบล็อก (เป็นภาษาสมบูรณ์ทัวริง) พร้อมกับไวยากรณ์ในประเพณีของภาษาแมโครแอสเซมเบลอร์ borland turbo แต่ขั้นสูงมากขึ้น

นอกจากนี้ยังมีภาษาการจัดการข้อมูลซึ่งช่วยให้ไบนารีรวมไฟล์โดยพลการทำการจัดการไบนารีและคณิตศาสตร์ทุกชนิดในนั้น (จำนวนเต็มเท่านั้น) ที่ "เวลารวบรวม" และเขียนผลลงในไฟล์เอาต์พุต ภาษาการจัดการข้อมูลนี้มีการควบคุมโครงสร้างและยังทำให้สมบูรณ์

มันง่ายกว่าการใช้งานมากกว่าการเขียนโปรแกรมที่ทำการจัดการแบบไบนารีใน C และอาจเป็นแม้แต่ในไพ ธ อน นอกจากนี้มันยังโหลดได้อย่างรวดเร็วเนื่องจากเป็นไฟล์ขนาดเล็กที่แทบจะไม่มีการพึ่งพาจากภายนอก (มี 2 เวอร์ชั่น: มันต้องใช้ libc เท่านั้นหรือสามารถรันเป็น executable โดยตรงบน Linux kernel ABI)

มันมีขอบด้านนอกเหมือนกัน

  1. ไม่รองรับการทำงานพร้อมกัน

  2. เมื่อเขียนในชุดประกอบ 32 บิต x86 (ใช้ได้กับ x86_64) คุณอาจต้องใช้ qemu หรืออีมูเลเตอร์ที่คล้ายกันหากคุณต้องการเรียกใช้กับสิ่งอื่นที่ไม่ใช่ x86 หรือ x86_64

  3. มันเป็นภาษาตัวประมวลผลก่อนแมโครที่ทรงพลังกำลังทำให้เสร็จสมบูรณ์ซึ่งหมายความว่าคุณควรมีประสบการณ์กับภาษาเช่น Lisp, Haskell, XSLT หรือ M4 อาจเป็นตัวเลือกที่ดีที่สุด

  4. ข้อมูลทั้งหมดที่จะถูกเขียนลงในไฟล์ที่ส่งออกจะดำเนินการในบัฟเฟอร์ "แบน" ในหน่วยความจำและบัฟเฟอร์นี้สามารถเติบโตได้ แต่ไม่หดตัวจนกว่าไฟล์เอาต์พุตที่ได้รับการเขียนและสิ้นสุด fasm ซึ่งหมายความว่าสามารถสร้างไฟล์ที่มีขนาดใหญ่ที่สุดเท่าที่คุณมีหน่วยความจำหลักในการทำงานของ fasm

  5. ข้อมูลสามารถเขียนลงในไฟล์เอาต์พุตไฟล์เดียวสำหรับการเรียกใช้ fasm แต่ละครั้ง

  6. ใช่มันเป็น homebrew อย่างแท้จริงและฉลาด


2

คุณไม่จำเป็นต้อง "สร้างสันติภาพ" ด้วยการแกะของ Perl ... หนึ่งในสิ่งที่ยอดเยี่ยมเกี่ยวกับ Perl คือวิธีที่คุณสามารถใช้ parser และตารางสัญลักษณ์ในการใช้ภาษาของคุณเองในแพ็คเกจที่กำหนดเอง

นี่เป็นสิ่งที่คุณกำลังมองหาใช่หรือไม่

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

การออกกำลังกายนั้นคือการเรียนรู้ perl ที่เพียงพอในการเขียนแพ็คเกจ 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แปลงเป็น / จากโหมดการแสดงผลแบบไบนารี / ascii และสามารถใช้ร่วมกับsedหรือviแต่ไม่มีคุณสมบัติการแลกเปลี่ยนไบต์


0

คุณสามารถไปหาทองคำและวางลงใน C หรือ ASM หากคุณกำลังทำงานกับไบนารีดิบเพียงแค่เด้งมันตรงออกจากทะเบียน คุณมี 'แล้ว'

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.