我无法修改套接字通信的十六进制字符串

时间:2016-02-05 21:47:05

标签: arrays perl sockets hex byte

我是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。 请给我一些想法! 提前谢谢。

2 个答案:

答案 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";