2016-02-05 52 views
1

我對Perl編程新手。 我想要做的是通過套接字發送一些十六進制字符串。 以下是我正在寫的一個perl代碼。 它完美的作品。 但我需要修改從第7字節到10字節是IP地址的十六進制字符串。我不能修改十六進制字符串的socket通信

#!/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;   

但我不知道如何修改這樣的$數據。 請給我一些想法! 在此先感謝。

回答

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); 
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"; 
+0

我下面竟然增加了額外的問題。 – user1339750

相關問題