как преобразовать массив байтов в int64 в perl - PullRequest
2 голосов
/ 13 апреля 2020

У меня есть конкретная c проблема, которую нужно решить в Perl 5 (с использованием минимальных внешних зависимостей, если возможно, совместимых с версией 5.12), связанных с декодированием массива байтов, например:

my @data = (0x00, 0x00, 0x00, 0x03, 0x84, 0x14, 0x40, 0x32);

и я хочу извлечь число, подобное этому: 15100821554

Я пробую несколько вариантов упаковать / распаковать без успеха, как

say(unpack("Q", pack("C*", @data)));

print 3620916657624449024

Эквивалентный код в go это что-то вроде этого

data := []byte{0x00, 0x00, 0x00, 0x03, 0x84, 0x14, 0x40, 0x32}
deciseconds := int64(binary.BigEndian.Uint64(data))

можно выполнить здесь: https://play.golang.org/p/I2J45H-sn-H

есть идеи?

Ответы [ 2 ]

5 голосов
/ 13 апреля 2020

Вы были почти там, работают следующие:

say unpack 'Q', pack 'C*', reverse @data;
#                          ~~~~~~~

Это означает, что вам нужен обратный порядок байтов, что означает упаковку следующим образом:

unpack 'Q>', pack 'C*', @data;
#        ^
0 голосов
/ 14 апреля 2020

Желаемый результат может быть достигнут с помощью следующего кода

use strict;
use warnings;
use feature 'say';

my $num = 0;
my @data = (0x00, 0x00, 0x00, 0x03, 0x84, 0x14, 0x40, 0x32);

$num = ($num<<8) + $_ for @data;

say $num;

Вывод

15100821554

ПРИМЕЧАНИЕ. Распаковка - это правильный способ преобразования

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...