سؤال

سؤالي بسيط:

هل هناك أي طريقة لرمز بطريقة بيثونيك أن الأمر باش?

hexdump -e '2/1 "%02x"' file.dat

من الواضح ، دون استخدام نظام التشغيل ، بوبين ، أو أي اختصار؛)

تحرير:على الرغم من أنني لم تحدد صراحة ، سيكون كبيرا إذا كان رمز وظيفية في بيثون 3.x

شكراً!

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

المحلول

إذا كنت تهتم فقط بيثون 2.x, line.encode('hex') سوف ترميز قطعة من البيانات الثنائية إلى عرافة.لذا:

with open('file.dat', 'rb') as f:
    for chunk in iter(lambda: f.read(32), b''):
        print chunk.encode('hex')

(إيرك, hexdump افتراضيا يطبع 32 زوجا من عرافة في كل سطر;إذا لم يكن كذلك ، فقط قم بتغيير ذلك 32 إلى 16 أو أيا كان...)

إذا كانت الحجة اثنين iter يبدو محيرا ، انقر فوق رابط المساعدة;انها ليست معقدة جدا بمجرد الحصول على هذه الفكرة.

إذا كنت تهتم بيثون 3.x, encode يعمل فقط لبرامج الترميز التي تحول سلاسل يونيكود إلى بايت;أي برامج الترميز التي تحول العكس (أو أي تركيبة أخرى) ، لديك لاستخدام codecs.encode للقيام بذلك صراحة:

with open('file.dat', 'rb') as f:
    for chunk in iter(lambda: f.read(32), b''):
        print(codecs.encode(chunk, 'hex'))

أو قد يكون من الأفضل استخدام hexlify:

with open('file.dat', 'rb') as f:
    for chunk in iter(lambda: f.read(32), b''):
        print(binascii.hexlify(chunk))

إذا كنت تريد أن تفعل شيئا إلى جانب طباعتها ، بدلا من قراءة الملف بأكمله في الذاكرة ، وربما كنت تريد أن تجعل مكرر.هل يمكن أن مجرد وضع هذا في وظيفة وتغيير ذلك print إلى أ yield, ، وهذه الوظيفة ترجع بالضبط المكرر الذي تريده.أو استخدام جينيكسر أو map اتصل:

with open('file.dat', 'rb') as f:
    chunks = iter(lambda: f.read(32), b'')
    hexlines = map(binascii.hexlify, chunks)

نصائح أخرى

المكتبة القياسية هي صديقك.جرب binascii.hexlify () .

ببساطة read() الملف كله و encode('hex').ماذا يمكن أن يكون أكثر بيثونيك?

with open('file.dat', 'rb') as f:
    hex_content = f.read().encode('hex')
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top