Пакет конвертировать байтовый массив в UINT64 - PullRequest
1 голос
/ 27 июня 2019

Я хочу преобразовать байтовый массив в UINT64, используя PHP.

Я могу сделать это легко в C #, но я хочу сделать это в PHP.

Вот код C #.

bytes = Encoding.UTF8.GetBytes(hashed);
BitConverter.ToUInt64(bytes, 0);

Я хочу преобразовать это в PHP.

Я пытался использовать функцию pack(), но она не работает.

Допустим, это байтовый массив.

$bytes = [101,102,54,55,99,55,56,49];
pack("J*","101","102","54","55","99","55","56","49");

Это показывает предупреждение.

epack (): 7 неиспользуемых аргументов в строке

Как я могу это исправить?

1 Ответ

0 голосов
/ 27 июня 2019

Основная проблема здесь (если я правильно понимаю) заключается в том, что вы используете числа PHP для представления байтового массива, однако unpack требует ввода строки. Если вы сохраняете массив как есть, тогда PHP, кажется, просто конвертирует числа в строки, что означает, что 101 будет «101», что, в свою очередь, составляет 3 байта, что разбивает все на части.

Вам необходимо сначала преобразовать числа в байты. Байт по сути представляет собой unsigned char, поэтому вы можете сначала упаковать массив в неподписанные символы, а затем распаковать их:

$bytes = [101,102,54,55,99,55,56,49];
$unpacked = unpack("J", pack('C*', ...$bytes));

echo current($unpacked);

Объяснение:

C - это код пакета для беззнакового символа, а * указывает, что вам нужно использовать все записи массива. Это сгенерирует строку символов на основе массива. Затем вы можете распаковать эту строку, используя J (если вы точно знаете, что байты были сгенерированы в порядке байтов с прямым порядком байтов) или P, если вы знаете, что байты были сгенерированы в порядке с прямым порядком байтов, или Q, если вы хочу использовать машинный заказ. Если бы байты были сгенерированы на той же машине, тогда Q, вероятно, был бы лучшим выбором, чем J, иначе вам нужно знать порядок байтов.

Пример: http://sandbox.onlinephpfunctions.com/code/5cba2c29522f7b9f9a0748b99fac768012e759ce

Примечание: это мое личное понимание того, что происходит, поэтому любой, кто лучше разбирается в упаковке / распаковке, может сообщить мне, если я что-то не так понял.

...