【问题标题】:How to convert 2 unsigned 16bit integers into a signed 32bit integer in Perl如何在 Perl 中将 2 个无符号 16 位整数转换为有符号 32 位整数
【发布时间】:2016-12-07 12:24:11
【问题描述】:

我有一个设备,它只能使用 Perl 以 无符号 16 位寄存器的形式向我发送数据。

我必须取 2 个寄存器并从中生成一个 32 位 有符号 整数。

我的挑战是用两个正值表示一个负值。

【问题讨论】:

  • 使用打包/解包

标签: perl type-conversion


【解决方案1】:

方法一:

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 上。
猜你喜欢
  • 1970-01-01
  • 2019-05-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多