首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何用整数分隔最左边的字节

如何用整数分隔最左边的字节
EN

Stack Overflow用户
提问于 2019-07-28 19:27:02
回答 2查看 220关注 0票数 2

这必须在Perl中完成:

我有整数的顺序,例如30_146_890_129,17_181_116_691和21_478_705_663。

据推测,这些字节由6个字节组成,其中:

  • 字节0-1 :值a
  • 字节2-3 :值b
  • 字节4-5 :值c

我想分离出a的值。我如何在Perl中做到这一点?

我试过使用>>操作符:

代码语言:javascript
复制
perl -e '$a = 330971351478 >> 16; print "$a\n";'
5050222
代码语言:javascript
复制
perl -e '$a = 17181116691 >> 16; print "$a\n";'
262163

但这些数字并不是我所期望的那样,更像是0-1000。

如果我也可以得到值,bc,但我并不真的需要这些。

谢谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-07-28 22:39:15

如果您有6个字节,则不需要首先将它们转换为一个数字。您可以根据字节的顺序使用以下一种:(大写表示最重要的字节)。

代码语言:javascript
复制
my ($num_c, $num_b, $num_a) = unpack('nnn', "\xCC\xcc\xBB\xbb\xAA\xaa");
my ($num_a, $num_b, $num_c) = unpack('nnn', "\xAA\xaa\xBB\xbb\xAA\xaa");
my ($num_c, $num_b, $num_a) = unpack('vvv', "\xcc\xCC\xbb\xBB\xaa\xAA");
my ($num_a, $num_b, $num_c) = unpack('vvv', "\xaa\xAA\xbb\xBB\xcc\xCC");

如果确实提供了一个数字0xCCccBBbbAAaa),则可以将其转换为字节,然后按如下方式提取所需的数字:

代码语言:javascript
复制
my ($num_c, $num_b, $num_a) = unpack('xxnnn', pack('Q>', $num));

或者,您也可以像您尝试的那样使用算术方法。

代码语言:javascript
复制
my $num_a =   $num         & 0xFFFF;
my $num_b = ( $num >> 16 ) & 0xFFFF;
my $num_c =   $num >> 32;

虽然前两种解决方案都需要一个Perl built to use 64-bit integers,但以下内容将适用于Perl的任何构建:

代码语言:javascript
复制
my $num_a =      $num           % 2**16;
my $num_b =    ( $num / 2**16 ) % 2**16;
my $num_c = int( $num / 2**32 );

让我们详细地看一下( $num >> 16 ) & 0xFFFF

代码语言:javascript
复制
Original number: 0x0000CCccBBbbAAaa
After shifting:  0x00000000CCccBBbb
After masking:   0x000000000000BBbb
票数 4
EN

Stack Overflow用户

发布于 2019-07-28 19:57:27

number >> 16返回移位16位的number,而不是您假设的移位位。例如,要获得最后16位,可以使用number % 2**16number & 0xffff。要到达bc,只需在得到最后16位之前进行移位,即

代码语言:javascript
复制
$a = $number & 0xffff;
$b = ($number >> 16) & 0xffff;
$c = ($number >> 32) & 0xffff;
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57244279

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档