سؤال

أنا أبحث عن لغة نصية (أو برمجة أعلى مستوى) لغة (أو على سبيل المثال الوحدات النمطية لبثون أو لغات مماثلة) لتحليل البيانات الثنائية والتلاعب بجدارة في الملفات (مثل مقالب الأساسية)، مثل Perl يسمح بتحويل الملفات النصية بسلاسة للغاية.

الأشياء التي أريد القيام بها تشمل تقديم قطع تعسفية للبيانات بأشكال مختلفة (ثنائية، عشرية، عرافة)، وتحويل البيانات من واحدة من نهر إلى آخر، وما إلى ذلك، وهذا هو، الأشياء التي ستستخدمها عادة C أو التجميع، لكنني تبحث عن لغة تتيح لك كتابة أجزاء صغيرة من التعليمات البرمجية لأغراض عالية للغاية لمرة واحدة بسرعة كبيرة.

أي اقتراحات؟

هل كانت مفيدة؟

المحلول

الأشياء التي أريد القيام بها تشمل تقديم قطع تعسفية للبيانات بأشكال مختلفة (ثنائية، عشرية، عرافة)، وتحويل البيانات من واحدة من نهر إلى آخر، وما إلى ذلك، وهذا هو، الأشياء التي ستستخدمها عادة C أو التجميع، لكنني تبحث عن لغة تتيح لك كتابة أجزاء صغيرة من التعليمات البرمجية لأغراض عالية للغاية لمرة واحدة بسرعة كبيرة.

حسنا، في حين أنه قد يبدو مضادا بديهيا، وجدت erlang. مناسبة للغاية لهذا، أي بسبب دعمها القوي ل نمط مطابقة, ، حتى بالنسبة لل bytes و bits (تسمى "بناء بناء البت erlang."). مما يجعل من السهل للغاية إنشاء برامج متقدمة للغاية تتعامل مع تفتيش البيانات ومعالجتها على بايت، وحتى على مستوى بعض الشيء:

منذ عام 2001، تأتي اللغة الوظيفية Erlang مع نموذج بيانات موجه نحو البايت (يسمى ثنائي) وبناء إنشاء نمط مطابقة على ثنائي.

وإلى اقتباس informit.com:

(Erlang) مطابقة نمط يبدأ حقا في الحصول على المتعة عند دمجها مع النوع الثنائي. فكر في تطبيق يتلقى حزم من شبكة ثم يعالجها. قد تكون البايتات الأربعة في حزمة معرف نوع حزمة علبة بايت الشبكة. في Erlang، فقط تحتاج إلى وظيفة عملية واحدة يمكن تحويل هذا إلى بنية بيانات للمعالجة الداخلية. سيبدو شيء هكذا:

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

لذلك، فإن Erlang مع دعمها المدمج لمطابقة الأنماط وكونها لغة وظيفية تعبيرية للغاية، انظر على سبيل المثال تنفيذ UENENCODE في Erlang:

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

للحصول على مقدمة، انظر ثنائيات bitlevel والفهم المعمم في ارلانجقد ترغب أيضا في التحقق من بعض المؤشرات التالية:

نصائح أخرى

بيرل رزمة و أفرغ ?

بيثون بيتسترنج تمت كتابة وحدة لهذا الغرض. يتيح لك أن تأخذ شرائح من الناحية الثنائية وتقدم عددا من التفسيرات المختلفة من خلال خصائص بيثون. كما أنه يعطي الكثير من الأدوات لبناء وتعديل البيانات الثنائية.

علي سبيل المثال:

>>> 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 لعرض الملفات. إذا كنت قد حصلت على بعض ملفات الرأس مع بعض الهياكل، فإن صنع قارئ للملفات الثنائية هو مسألة دقائق.

ستفعل أي لغة برمجة رفيعة المستوى مع وظائف حزمة / فك. كل 3 بيرل، بايثون وروبي يمكن أن تفعل ذلك. الأمر يهم تفضيلات شخصية. كتبت بعضا من التحليل الثنائي في كل من هذه الأشياء وشعرت أن روبي كان أسهل / الأكثر أناقة لهذه المهمة.

لماذا لا تستخدم مترجم C C؟ كنت تستخدمها دائما لتجربة القصاصات، ولكن يمكنك استخدام واحد لإرسال شيء مثلك دون أن تصف الكثير من المتاعب.

لقد أحببت دائما إمرأة. وبعد لقد مات، لكن المشروع قد تم إحياءه مؤخرا. EIC قادرة بشكل مدهش وسريع بشكل معقول. يوجد ايضا سينت. وبعد يمكن تجميع كلاهما لمنصات مختلفة، على الرغم من أنني أعتقد أن Cint يحتاج إلى Cygwin على Windows.

تحتوي مكتبة Python القياسية على بعض ما تحتاجه - مجموعة مصفوفة الوحدة على وجه الخصوص تتيح لك بسهولة قراءة أجزاء من الملفات الثنائية، مبادلة الانتصاف، إلخ؛ ال بنية الوحدة تسمح بتفسير غامق من السلاسل الثنائية. ومع ذلك، لا يوجد غني تماما كما تحتاج: على سبيل المثال، لتقديم نفس البيانات مثل بايت أو نصف كلمات، تحتاج إلى نسخها بين صفيفين ( numpy. الوظيفة الإضافية لجهة خارجية أكبر بكثير لتفسير نفس مجال الذاكرة في عدة طرق مختلفة)، وعلى سبيل المثال، لعرض بعض البايتات في عرافة لا يوجد شيء "مجمعة" تتجاوز حلقة بسيطة أو فهم قائمة مثل [hex(b) for b in thebytes[start:stop]]. وبعد أظن أن هناك وحدات طرف ثالث قابلة لإعادة الاستخدام لتسهيل هذه المهام بعد أبعد من ذلك، لكنني لا أستطيع توجيهك إلى واحد ...

يمكن أن يكون أيضا جيدا في هذا، لكنه أركان قليلا.

حسنا، إذا كانت السرعة ليست مراعاة، وتريد بيرل، فقم بترجمة كل سطر ثنائي إلى خط السحر - 0's و 1. نعم، أعلم أنه لا توجد رابطات في ثنائي :) ولكن من المفترض أن يكون لديك بعض الحجم الثابت - على سبيل المثال بواسطة البايت أو وحدة أخرى، يمكنك من خلالها تفكيك Blinary Blob.

ثم استخدم معالجة سلسلة بيرل على تلك البيانات :)

إذا كنت تقوم بمعالجة المستوى الثنائي، فمن المنخفض للغاية، ومن المحتمل أن يكون من المحتمل أن يكون فعالا للغاية ولديه الحد الأدنى من التبعيات / تثبيت متطلبات.

لذلك أود أن أذهب مع C - مقابض بايت جيدا - وربما يمكنك جوجل لبعض حزم المكتبة التي تتعامل مع البايتات.

إن الذهاب مع شيء مثل Erlang يقدم عدم الكفاءة والتبعية والأمتعة الأخرى التي لا تريدها مع مكتبة منخفضة المستوى.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top