質問

私は、私は、配列にそれを取得したいファイルのメッセージの進ダンプを持っています ので、私はそれにデコードするロジックを実行することができます。
それは、このようなメッセージを解析する簡単な方法だった場合、私は思っていた。

  

37 39 30 35 32 34 35 34(b)32 31 36 39 33 34 35
  図3(b)32 31 36 39 33 34 36 00 00 01 08 40 00 00 15
  (c)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 63 6C 6F 72 64 69
  74 65 6C 63 6F 72 64 69

データは、任意の行に16バイト最大できることに留意されたいです。しかし、任意の行が少ない含めることができます(最小:1)あまりにもバイト
perlの?

で一度に2つの文字を読むことではなく、素敵でエレガントな方法はあります
役に立ちましたか?

解決

はPerlは hex のオペレータを有する行うあなたのための復号化ロジック

  

hex EXPR

     

hex

     

を解釈EXPR 16進文字列を返す対応する値として。 (00x、または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

私は、一度に2つの文字で読むの論理トークン2文字単位であるストリームを解析するための適切な方法だと思います。

あなたはそれが醜いだと思ういくつかの理由がありますか?

あなたが特定のシーケンスを抽出しようとしている場合は、

は、あなたが空白と小文字を区別しない正規表現でそれを行うことができます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top