【发布时间】:2016-12-07 12:24:11
【问题描述】:
我有一个设备,它只能使用 Perl 以 无符号 16 位寄存器的形式向我发送数据。
我必须取 2 个寄存器并从中生成一个 32 位 有符号 整数。
我的挑战是用两个正值表示一个负值。
【问题讨论】:
-
使用打包/解包
标签: perl type-conversion
我有一个设备,它只能使用 Perl 以 无符号 16 位寄存器的形式向我发送数据。
我必须取 2 个寄存器并从中生成一个 32 位 有符号 整数。
我的挑战是用两个正值表示一个负值。
【问题讨论】:
标签: perl type-conversion
方法一:
my $int32 = unpack('l>', pack('nn', $hi16, $lo16));
方法二:
my $int32 = ( $hi16 << 16 ) | $lo16;
$int32 -= 2**32 if $int32 >= 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
【讨论】:
-E 命令行开关而不是-e,则不必使用CORE::say。
-E 不向前兼容。由于它启用了所有功能,因此当前在 -E 下运行的代码可能不会在更高版本的 Perl 上。