Как преобразовать массив байтов в целое число в Perl - PullRequest
1 голос
/ 03 января 2011

На Java я бы сделал

System.out.println(new BigInteger(new byte[]{0,(byte)171,52,33}).intValue());

Как бы вы сделали это в Perl?

Ответы [ 2 ]

2 голосов
/ 03 января 2011

Используйте pack и unpack:

C:\Users\pgp\Documents\src\tmp>cat pack.pl
use Modern::Perl; # strict, warnings, v5.10 features

say unpack "N", pack "C4", 0, 171, 52, 33; # big endian
say unpack "V", pack "C4", 0, 171, 52, 33; # little endian

C:\Users\pgp\Documents\src\tmp>perl pack.pl
11220001
557099776

Я не могу вспомнить, что указывает Java в порядке байтов, но вы можете выбрать.

РЕДАКТИРОВАТЬ: как подсказывает ysth, он имеет 32-битное ограничение.Я думаю, что есть pack опции до 64 бит, но не дальше.Если вам нужна произвольная точность, его ответ лучше.

1 голос
/ 03 января 2011

Полагаю, вы бы хотели что-то вроде:

#!/usr/bin/perl
use strict;
use warnings;
use 5.010;
use Math::BigInt;
say Math::BigInt->new( '0x' . join('', map sprintf('%.2x', $_), 171, 52, 33) );

Преобразует элементы массива в шестнадцатеричную строку 0xab3421 и использует ее для создания bigint.

...