Преобразовать целое число в длину 8 байт - PullRequest
2 голосов
/ 20 марта 2019

Я работаю над генерацией некоторых порядковых номеров, и мне нужно кодировать их в длинном формате, то есть в стандартном 8-байтовом, так как нижестоящий поток - это приложение Java, а сгенерированный номер должен быть прочитан типом данных Long Java.

Я искал переполнение стека и мог найти ответы на других языках, но не на Perl.

Обратите внимание, что приведенные ниже данные печатаются в 8 байтах в форме ASCII:

$ perl -le ' BEGIN { printf("%08d\n", 256) } '
00000256
$

Но я этого не хочу.Я хочу, чтобы необработанные шестнадцатеричные значения выходных данных были:

\x00 \x00 \x00 \x00 \x00 \x00 \x01 \x00

Что при сканировании как 8 байт Long должно снова стать 256.

Для 255 должно быть:

\x00 \x00 \x00 \x00 \x00 \x00 \x00 \xFF

Как это можно сделать в Perl?

1 Ответ

3 голосов
/ 20 марта 2019

pack () - твой друг.

my $long = pack('Q', $value);

Это создаст 64-битное, 8-байтовое целое число без знака в собственном формате с прямым порядком байтов, однако, если вы хотите определенный, то есть не собственный формат с прямым порядком байтов, добавление > после Q вызовет big-endian и < заставит little-endian

Обратите внимание, что это работает только на 64-битных процессорах.

Из вашего вопроса вам нужен формат с прямым порядком байтов, поэтому вам нужно

my $long = pack('Q>', $value);

, который преобразует 256 в "\x0\x0\x0\x0\x0\x0\x1\x0"

См. perldoc pack для получения дополнительной информации об этой полезной функции.

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