如果您有 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