bin2hex () обрезает конечные нули - PullRequest
0 голосов
/ 03 июля 2019

У меня есть форма, которая вставляет элементы в базу данных MySQL при отправке.Я решил создать 16-битные идентификаторы для элементов, используя метод random_bytes в PHP, чтобы при каждой отправке формы я уже знал этот идентификатор и мне не приходилось повторно запрашивать его у базы данных.

Для вставки идентификатора в ссылку на странице, которую я пробовал использовать метод bin2hex.Это нормально работает правильно.Однако, когда идентификатор имеет конечные нули, метод, кажется, обрезает их (передавая прямой результат метода random_bytes).На других страницах, где я использую функцию с тем же идентификатором, полученным из базы данных, она не делает этого и работает правильно.

Другими словами, если идентификатор заканчивается на 000, он отображается правильно в шестнадцатеричном представлениикогда bin2hex вызывается из базы данных, извлекается двоичное представление.Однако нули отсутствуют в шестнадцатеричном представлении, когда функция вызывается на прямом выходе функции random_bytes.

Вот начальный код:

$uuid = random_bytes(16);
$uuidHex = bin2hex($uuid);

Позже втот же сценарий:

$GLOBALS["ID"]  = '0x' . $uuidHex;

сценарий внутри ссылки href атрибут:

<?php echo $ID; ?>

Вот пример кода, в котором может возникнуть проблема:

0xa87ea4fc142fcdeasjf90j3771eda500

1 Ответ

0 голосов
/ 03 июля 2019

Как мы узнаем, что bin2hex обрезает конечные нули?

$uuid = random_bytes(16);

Это нечитабельно, это даст вам криптографически стойких случайных байтов.Мы конвертируем его в шестнадцатеричное.

$uuidHex = bin2hex($uuid); 

Теперь это даст вам случайную строку 32 бит , а не 16. Но почему?Потому что в шестнадцатеричном виде байт всегда выражается как 2 символа.Разделите 32 на 2. Кроме того, вы добавляете «0x» в строку, что делает его 18-битным.Чтобы получить 16-битный результат, выполните следующие действия:

$uuid = random_bytes(7);
$uuidHex = bin2hex($uuid);
$GLOBALS["ID"]  = '0x' . $uuidHex; // 16 bit string 

Поскольку при random_bytes(7) мы получаем 7 × 2 длины строки, равной 14, а затем добавляем «0x», что составляет 14 + 2 = a 16 битовая строка

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