如何在Perl中将2个无符号16位整数转换为带符号的32位整数

时间:2016-12-06 15:20:38

标签: perl type-conversion

我有一个设备只能使用Perl将数据作为无符号 16位寄存器发送给我。

我必须从2个寄存器中取出32位签名的整数。

我的挑战是表示具有两个正面的负值。

1 个答案:

答案 0 :(得分:3)

方法1:

my $int32 = unpack('l>', pack('nn', $hi16, $lo16));

方法2:

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