سؤال

لدي تفريغ سداسي لرسالة في ملف أريد الحصول عليه في صفيف حتى أتمكن من تنفيذ منطق فك التشفير عليه.
كنت أتساءل عما إذا كانت هذه طريقة أسهل لتحليل رسالة تبدو هكذا.

37 39 30 35 32 34 35 34 3B 32 31 36 39 33 34 35
3B 32 31 36 39 33 34 36 00 00 01 08 40 00 00 15
6C 71 34 34 73 69 6D 31 5F 33 30 33 31 00 00 00
00 00 01 28 40 00 00 15 74 65 6C 63 6F 72 64 69
74 65 6C 63 6F 72 64 69

لاحظ أن البيانات يمكن أن تكون كحد أقصى 16 بايت على أي صف. ولكن يمكن أن يحتوي أي صف على عدد أقل من البايتات (الحد الأدنى: 1)
هل هناك طريقة لطيفة وأنيقة بدلاً من قراءة 2 chars في وقت واحد في بيرل؟

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

المحلول

بيرل لديه hex المشغل الذي يؤدي منطق فك التشفير لك.

hex EXPR

hex

يفسر Expr كسلسلة سداسية ويعيد القيمة المقابلة. (لتحويل السلاسل التي قد تبدأ بأي منهما 0, 0x, ، أو 0b, ، يرى oct.) إذا تم حذف expr ، فاستخدمات $_.

print hex '0xAf'; # prints '175'
print hex 'aF'; # same

تذكر أن السلوك الافتراضي لـ split قم بتشكيل سلسلة في فواصل المسافة البيضاء ، لذلك على سبيل المثال

$ perl -le '$_ = "a b c"; print for split'
a
b
c

لكل سطر من الإدخال ، افصله في قيم سداسية ، وتحويل القيم إلى الأرقام ، و push على صفيف للمعالجة اللاحقة.

#! /usr/bin/perl

use warnings;
use strict;

my @values;
while (<>) {
  push @values => map hex($_), split;
}

# for example
my $sum = 0;
$sum += $_ for @values;
print $sum, "\n";

تشغيل العينة:

$ ./sumhex mtanish-input 
4196

نصائح أخرى

أود أن أقرأ خطًا في وقت واحد ، وتجريد المسافة البيضاء ، والاستخدام pack 'H*' لتحويلها. من الصعب أن تكون أكثر تحديداً دون معرفة نوع "فك تشفير المنطق" الذي تحاول تطبيقه. على سبيل المثال ، إليك إصدار يحول كل بايت إلى عشري:

while (<>) {
  s/\s+//g;
  my @bytes = unpack('C*', pack('H*', $_));
  print "@bytes\n";
}

الإخراج من ملف نموذجك:

55 57 48 53 50 52 53 52 59 50 49 54 57 51 52 53
59 50 49 54 57 51 52 54 0 0 1 8 64 0 0 21
108 113 52 52 115 105 109 49 95 51 48 51 49 0 0 0
0 0 1 40 64 0 0 21 116 101 108 99 111 114 100 105
116 101 108 99 111 114 100 105

أعتقد أن القراءة في حرفين في وقت واحد هي الطريقة المناسبة لتحليل دفق له الرموز المنطقية هي وحدات موقتين.

هل هناك سبب تعتقد أنه قبيح؟

إذا كنت تحاول استخراج تسلسل معين ، فيمكنك القيام بذلك مع تعبيرات منتظمة غير حساسة للمسافة البيضاء.

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