5

メッセージの16進ダンプがファイルにあり、それを配列に入れて、デコードロジックを実行できるようにします。
これが、このようなメッセージを解析するためのより簡単な方法であるかどうか疑問に思いました。

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)
perlで一度に2文字を読み取るのではなく、優れたエレガントな方法はありますか?

4

3 に答える 3

6

Perlにはhex、デコードロジックを実行する演算子があります。

hex EXPR

hex

EXPRを16進文字列として解釈し、対応する値を返します。(、、、またはのいずれか0で始まる可能性のある文字列を変換するには、を参照してください。)EXPRが省略されている場合は、を使用します。0x0boct$_

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

空白の区切り文字で文字列を切り刻むデフォルトの動作を覚えておいてくださいsplit。たとえば、

$ perl -le'$ _ = "ab c"; 分割用に印刷」
a
b
c

入力のすべての行について、16進値に分割し、値を数値に変換して、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
于 2010-08-05T10:10:16.847 に答える
6

一度に 1 行ずつ読み取り、空白を取り除き、それを使用pack 'H*'して変換します。どのような種類の「デコード ロジック」を適用しようとしているのかを知らずに、より具体的にすることは困難です。たとえば、各バイトを 10 進数に変換するバージョンは次のとおりです。

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
于 2010-08-05T03:48:35.347 に答える
0

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

それが醜いと思う理由はありますか?

特定のシーケンスを抽出しようとしている場合は、空白に依存しない正規表現を使用して抽出できます。

于 2010-08-05T03:30:42.323 に答える