我正在做套接字编程。 从套接字接收的数据($ data)包含4个字节的长度数据+ json数据。 我想修剪长度,只解析json。
我已经完成了代码,并且可以正常工作。但我想知道是否有更有效的方法(算法)。
在perl中是否有一种有效的将数组移动到变量的方法?
@tmpp = split(//,$data); #data = socket data
my $t1 = sprintf("%02x%02x%02x%02x",ord($tmpp[0]),ord($tmpp[1]),ord($tmpp[2]),ord($tmpp[3]));
$t1 = hex($t1); #t1 = length
my $json;
my @tmp = @tmpp[0..-1];
foreach(@tmp){ $json .= $_;}<br>
print $json;
Ok Print ;
答案 0 :(得分:2)
这是pack/unpack的标准情况。 N/a
模板将解包长度为N
的字符串(以网络字节顺序):
my( $json ) = unpack 'N/a', $data;
print $json;
答案 1 :(得分:0)
如果您说的话,只需剥掉长度前缀即可。
my $json = substr($data, 4);
但这意味着长度前缀是无用的,这表明您在程序的早期就有一个重大错误。您从插座正确读取了吗?
sub read_bytes {
my ($fh, $bytes_to_read) = @_;
my $buf = '';
while ($bytes_to_read) {
my $bytes_read = read($fh, $buf, $bytes_to_read, length($buf))
die($!) if !defined($bytes_read);
die("Premature EOF") if !$bytes_read;
$bytes_to_read -= $bytes_read;
}
return $buf;
}
sub read_uint32be { unpack('N', read_bytes($_[0], 4)) }
sub read_string {
my ($fh) = @_;
my $len = read_uint32be($fh);
return read_bytes($fh, $len);
}
my $json = read_string($sock);