我是perl编程的新手。 我想要做的是在套接字上发送一些十六进制字符串。 以下是我写的perl代码。 它完美地运作。 但我需要修改从第7个字节到第10个字节的十六进制字符串,即IP地址。
#!/usr/bin/perl -w
use IO::Socket::INET;
my $data= "\x0f\x00\x00\x00\x00\x00\x0a\x14\x1f\x01";
# create a socket
my $sock = new IO::Socket::INET(
PeerAddr=>'192.168.1.101',
PeerPort=>'8121',
Proto=>'udp) or die $!;
# send some data to server
$sock->send($data);
$sock->close();
exit(0);
但我不知道如何修改$ data的IP地址部分。 如果我使用如下,
my @data= (0x0f,0x00,0x00,0x00,0x00,0x00,0x0a,0x14,0x1f,0x01);
我可以访问数据并进行如下修改。
$data[6] = 0x0a;
$data[7] = 0x14;
$data[8] = 0x1f;
$data[9] = 0x02;
但我不知道如何修改这样的$ data。 请给我一些想法! 提前谢谢。
答案 0 :(得分:0)
my $data = join '', map chr, @data;
或
my $data = pack 'C*', @data;
当然,您不需要将整个字符串转换为单独的数字。
my @ip_octets = ( 10, 20, 31, 1 );
my $data= "\x0f\x00\x00\x00\x00\x00" . pack('C*', @ip_octets);
更好的是,让我们从实际的IP地址开始。
use Socket qw( inet_aton );
my $ip_addr = '10.20.31.1';
my $data= "\x0f\x00\x00\x00\x00\x00" . inet_aton($ip_addr);
答案 1 :(得分:0)
要更改perl中字符串的一部分,您可以使用substr
作为左值,如下所示:
substr($data,6,1) = "\x0a";
substr($data,7,1) = "\x14";
substr($data,8,1) = "\x1f";
substr($data,9,1) = "\x02";
或
substr($data,6,4) = "\x0a\x14\x1f\x01";