0

Perl の非常に基本的なことに関する質問がありますが、効率的な解決策が見つかりません。

ここでは、最初に少しコンテキストを示します。私はNet::Pcapなどを使用し、パケットを処理する関数 (によって使用される) にいるとき、パケット全体 (イーサネットヘッダー + IP ヘッダー + tcp/udp ヘッダー + ペイロード) を含むスカラーpcap_loopを取得します。$packet

私がしたいのは、ユーザー定義の宛先MACアドレス(たとえば、コマンドライン引数などとして渡される)を使用して、 を使用して送信できる$packetを取得するために、これ(イーサネット宛先)の最初の6バイトを変更することです。など。したがって、ユーザー定義のアドレスを分割して (たとえば、を使用して)、宛先 MAC アドレスの 6 つの部分ごとに取得し、関数を使用してそれを 16 進数に変換できますが、パケットの最初のバイトを変更してこれらに置き換えることができます。エドバイト。どうすればよいですか?$packetpcap_sendpacket00:11:22:33:44:55splithexhex

連結(。)を使用することを考えましたが、この解決策は汚いと思います。

C で考えて (少し前に C でやったので、Perl でやりたいので)、 " u_char packet[]"を取得したらmemcpy、最初の 6 バイトにユーザー提供のイーサネット アドレスを適用する必要がありました。私のpacket[]とそれは働いた。

4

3 に答える 3

2

substr()inの説明を参照してくださいperldoc perlfunc。これには、スカラーの一部を置き換えることができる 4 つのパラメーター形式があります。

substr EXPR, OFFSET, LENGTH, REPLACEMENT

したがって、次のようなものがうまくいくはずです:

substr $packet, 0, 6, $new_header
于 2009-07-24T08:34:45.160 に答える
1

このvec関数は、スカラー値をビット ベクトルとして処理するために使用されます。

use strict;
use warnings;

my $packet;
# set packet to something...

my $address = '00:11:22:33:44:55';
my @bytes   = map { hex } split(/:/, $address);
for my $i (0 .. $#bytes) {
    vec($packet, $i, 8) = $bytes[$i];
}
于 2009-07-24T12:46:38.320 に答える