如何在Perl中将2个无符号16位整数转换为有符号32位整数
我有一个设备,它只能使用Perl以无符号16位寄存器的形式向我发送数据 我必须取2个寄存器,并从中生成一个32位有符号整数 我的挑战是表示一个有两个正值的负值。方法1:如何在Perl中将2个无符号16位整数转换为有符号32位整数,perl,type-conversion,Perl,Type Conversion,我有一个设备,它只能使用Perl以无符号16位寄存器的形式向我发送数据 我必须取2个寄存器,并从中生成一个32位有符号整数 我的挑战是表示一个有两个正值的负值。方法1: my $int32 = unpack('l>', pack('nn', $hi16, $lo16)); 方法2: my $int32 = ( $hi16 << 16 ) | $lo16; $int32 -= 2**32 if $int32 >= 2**31; my$int32=($hi16=2**31
my $int32 = unpack('l>', pack('nn', $hi16, $lo16));
方法2:
my $int32 = ( $hi16 << 16 ) | $lo16;
$int32 -= 2**32 if $int32 >= 2**31;
my$int32=($hi16=2**31;
比如说,
$ perl -e'
use feature qw( say );
my $hi16 = 0xFFFF;
my $lo16 = 0xFFFD;
say $hi16;
say $lo16;
{
my $int32 = unpack("l>", pack("nn", $hi16, $lo16));
say $int32;
}
{
my $int32 = ( $hi16 << 16 ) | $lo16;
$int32 -= 2**32 if $int32 >= 2**31;
say $int32;
}
'
65535
65533
-3
-3
$perl-e'
使用特征qw(例如);
my$hi16=0xFFFF;
my$lo16=0xFFFD;
比如说$hi16;
比如16美元;
{
my$int32=解包(“l>”,打包(“nn”,$hi16,$lo16));
比如说$int32;
}
{
my$int32=($hi16=2**31;
比如说$int32;
}
'
65535
65533
-3
-3
方法1:
my $int32 = unpack('l>', pack('nn', $hi16, $lo16));
方法2:
my $int32 = ( $hi16 << 16 ) | $lo16;
$int32 -= 2**32 if $int32 >= 2**31;
my$int32=($hi16=2**31;
比如说,
$ perl -e'
use feature qw( say );
my $hi16 = 0xFFFF;
my $lo16 = 0xFFFD;
say $hi16;
say $lo16;
{
my $int32 = unpack("l>", pack("nn", $hi16, $lo16));
say $int32;
}
{
my $int32 = ( $hi16 << 16 ) | $lo16;
$int32 -= 2**32 if $int32 >= 2**31;
say $int32;
}
'
65535
65533
-3
-3
$perl-e'
使用特征qw(例如);
my$hi16=0xFFFF;
my$lo16=0xFFFD;
比如说$hi16;
比如16美元;
{
my$int32=解包(“l>”,打包(“nn”,$hi16,$lo16));
比如说$int32;
}
{
my$int32=($hi16=2**31;
比如说$int32;
}
'
65535
65533
-3
-3
Use-pack/unpack/unpack如果使用-E
命令行开关而不是-E
-E
则不必使用CORE::say
,因为它启用了所有功能,所以当前在-E
下运行的代码可能不会出现在更高版本的Perl上。您不必使用CORE::say
如果使用-E
命令行开关而不是-E
,-E
是不向前兼容的。由于它启用了所有功能,当前在-E
下运行的代码可能不会在更高版本的Perl上运行。