这必须在Perl中完成:
我有整数的顺序,例如30_146_890_129,17_181_116_691和21_478_705_663。
据推测,这些字节由6个字节组成,其中:
abc我想分离出a的值。我如何在Perl中做到这一点?
我试过使用>>操作符:
perl -e '$a = 330971351478 >> 16; print "$a\n";'
5050222perl -e '$a = 17181116691 >> 16; print "$a\n";'
262163但这些数字并不是我所期望的那样,更像是0-1000。
如果我也可以得到值,b和c,但我并不真的需要这些。
谢谢!
发布于 2019-07-28 22:39:15
如果您有6个字节,则不需要首先将它们转换为一个数字。您可以根据字节的顺序使用以下一种:(大写表示最重要的字节)。
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),则可以将其转换为字节,然后按如下方式提取所需的数字:
my ($num_c, $num_b, $num_a) = unpack('xxnnn', pack('Q>', $num));或者,您也可以像您尝试的那样使用算术方法。
my $num_a = $num & 0xFFFF;
my $num_b = ( $num >> 16 ) & 0xFFFF;
my $num_c = $num >> 32;虽然前两种解决方案都需要一个Perl built to use 64-bit integers,但以下内容将适用于Perl的任何构建:
my $num_a = $num % 2**16;
my $num_b = ( $num / 2**16 ) % 2**16;
my $num_c = int( $num / 2**32 );让我们详细地看一下( $num >> 16 ) & 0xFFFF。
Original number: 0x0000CCccBBbbAAaa
After shifting: 0x00000000CCccBBbb
After masking: 0x000000000000BBbb发布于 2019-07-28 19:57:27
number >> 16返回移位16位的number,而不是您假设的移位位。例如,要获得最后16位,可以使用number % 2**16或number & 0xffff。要到达b和c,只需在得到最后16位之前进行移位,即
$a = $number & 0xffff;
$b = ($number >> 16) & 0xffff;
$c = ($number >> 32) & 0xffff;https://stackoverflow.com/questions/57244279
复制相似问题