Bin2hex: примеры (PHP)

Преобразование данных функцией bin2hex в языке PHP
Раздел: Преобразование типов/форматов
bin2hex(string $string): string

Функция bin2hex в PHP

Функция bin2hex преобразует строку байтов (бинарные данные) в шестнадцатеричное представление. Каждый байт исходной строки заменяется на две шестнадцатеричные цифры, что удваивает длину результата.

Назначение и применение

Функция находит применение в различных задачах:

  • Кодирование бинарных данных для безопасной передачи в текстовых протоколах (например, email, XML, JSON).
  • Создание шестнадцатеричных дампов данных для отладки.
  • Подготовка данных для криптографических операций или хеширования.
  • Генерация шестнадцатеричных представлений для отображения пользователю.
Синтаксис и параметры
string bin2hex ( string $string )

Функция принимает один обязательный аргумент:

  • string — строка для преобразования. Если передается не строковый аргумент, он будет преобразован в строку.

Функция возвращает строку, содержащую шестнадцатеричное представление переданных данных. Символы в результатах представляются в нижнем регистре.

Простые примеры использования

Базовое преобразование строки
echo bin2hex('Hello');
48656c6c6f
Преобразование бинарных данных
$binary = "\x00\x01\x02\xFF";
echo bin2hex($binary);
000102ff
Работа со строкой, содержащей кириллицу
echo bin2hex('Привет');
d09fd180d0b8d0b2d0b5d182
Автоматическое преобразование нестроковых аргументов
echo bin2hex(12345);
3132333435

Похожие функции в PHP

Функция выполняет обратное преобразование — декодирует шестнадцатеричную строку в бинарные данные. Используют пару с bin2hex.

base64_encode и base64_decode

Кодируют данные в формат Base64. Этот метод обеспечивает более эффективное использование пространства (увеличивает данные примерно на 33% против 100% у bin2hex) и лучше подходит для передачи бинарных данных в текстовых средах.

Функция распаковывает бинарные данные в массив согласно заданному формату. Может использоваться для сложных преобразований между бинарными и другими форматами.

sprintf и printf с форматом %x

Позволяют форматировать шестнадцатеричный вывод для отдельных чисел, но не для произвольных строк байтов.

Критерии выбора

Функцию bin2hex предпочтительнее использовать, когда требуется точное шестнадцатеричное представление каждого байта. Base64 больше подходит для кодирования с целью передачи, поскольку создает более компактный вывод. Для обратного преобразования всегда используют соответствующую функцию (hex2bin или base64_decode).

Аналоги в других языках

Bin2hex в Python

Метод bytes.hex() или функция binascii.hexlify().

data = b'Hello'
print(data.hex())
# Или
import binascii
print(binascii.hexlify(data).decode())
48656c6c6f
48656c6c6f

Bin2hex в Javascript

Метод Buffer.from().toString('hex') в Node.js или ручное преобразование в браузере.

// Node.js
const buf = Buffer.from('Hello');
console.log(buf.toString('hex'));

// Браузер
function toHex(str) {
  return Array.from(str).map(c => 
    c.charCodeAt(0).toString(16).padStart(2, '0')).join('');
}
console.log(toHex('Hello'));
48656c6c6f
48656c6c6f

Bin2hex в MySQL

Функции HEX() и UNHEX().

SELECT HEX('Hello');
48656C6C6F
Отличия

В отличие от PHP, в Python и JavaScript обычно работают с объектами типа bytes или Buffer. MySQL возвращает результат в верхнем регистре. PHP функция работает со строками, рассматривая их как последовательности байтов, что важно учитывать при работе с многобайтовыми кодировками.

Типичные ошибки

Неправильная интерпретация многобайтовых строк

Функция работает с байтами, а не символами. Для строк в UTF-8 один символ может занимать несколько байтов.

$char = '€';
echo bin2hex($char); // Кодировка UTF-8
e282ac
Попытка декодировать результат без hex2bin

Неправильный способ обратного преобразования.

$hex = bin2hex('test');
$back = pack('H*', $hex); // Работает, но лучше использовать hex2bin
echo $back;
test
Ожидание верхнего регистра

Функция всегда возвращает строчные буквы, что иногда не соответствует ожиданиям.

echo bin2hex('ABC');
414243
Передача нестроковых значений

Хотя функция преобразует аргумент в строку, это может привести к неочевидным результатам.

echo bin2hex(true);
echo bin2hex(null);
31

Изменения в последних версиях PHP

PHP 8.0.0

Тип возвращаемого значения теперь точно указан как string. Ранее в документации указывался тип string, но теперь это закреплено в объявлении функции.

PHP 7.4.0

Были улучшения внутренней обработки ошибок, но публичный API функции не изменялся.

PHP 5.4.0

Была добавлена обратная функция hex2bin для декодирования шестнадцатеричных строк.

Функция bin2hex остается стабильной многие годы, что свидетельствует о ее надежности и завершенности реализации.

Расширенные примеры применения

Генерация шестнадцатеричного дампа файла
Пример php
function hexDump($filePath, $bytesPerLine = 16) {
    $handle = fopen($filePath, 'rb');
    $offset = 0;
    while (!feof($handle)) {
        $chunk = fread($handle, $bytesPerLine);
        if ($chunk === '') break;
        
        $hex = bin2hex($chunk);
        $hex = chunk_split($hex, 2, ' ');
        
        printf('%08x: %-'.($bytesPerLine*3).'s\n', 
               $offset, $hex);
        $offset += $bytesPerLine;
    }
    fclose($handle);
}

hexDump(__FILE__, 8);
00000000: 3c3f 7068 7020 0a
00000008: 6675 6e63 7469 6f6e
...
Сравнение бинарных данных без учета регистра
Пример php
function compareBinIgnoreCase($bin1, $bin2) {
    return strcasecmp(bin2hex($bin1), bin2hex($bin2));
}

$result = compareBinIgnoreCase("Hello", "HELLO");
echo $result === 0 ? 'Совпадают' : 'Различаются';
Различаются
Создание уникального идентификатора из бинарных данных
Пример php
function binaryToUid($binaryData) {
    $hex = bin2hex($binaryData);
    return implode('-', str_split($hex, 8));
}

$data = random_bytes(16);
echo binaryToUid($data);
a1b2c3d4-e5f67890-1234abcd-ef567890
Шестнадцатеричное кодирование с разделителями
Пример php
function hexWithSeparator($data, $separator = ':') {
    $hex = bin2hex($data);
    return implode($separator, str_split($hex, 2));
}

echo hexWithSeparator('Hello');
48:65:6c:6c:6f
Подсчет частоты байтов в данных
Пример php
function byteFrequency($data) {
    $hex = bin2hex($data);
    $bytes = str_split($hex, 2);
    return array_count_values($bytes);
}

$freq = byteFrequency('abracadabra');
arsort($freq);
print_r($freq);
Array
(
    [61] => 5
    [62] => 2
    [72] => 2
    [63] => 1
    [64] => 1
)

PHP bin2hex function comments

En
Bin2hex Convert binary data into hexadecimal representation