ویژگی تصویر

تابع bin2hex() در PHP

  /  PHP   /  تابع bin2hex() در PHP
بنر تبلیغاتی الف
آموزش PHP

تابع bin2hex() در PHP برای تبدیل داده‌های باینری (bytes) به نمایش هگزادسیمال متنی استفاده می‌شود. خروجی این تابع رشته‌ای شامل کاراکترهای 0-9 و a-f است که هر بایت ورودی را به دو کاراکتر هگز تبدیل می‌کند. این تابع برای ذخیره‌سازی، نمایش دیباگ، تولید شناسه‌های تصادفی و انتقال ایمن بایت‌ها به فرمت متنی کاربردی است.

تعریف و امضا

امضای تابع به‌صورت زیر است:

string bin2hex(string $str)

نکته: bin2hex تابعی binary-safe است؛ یعنی هر بایتی در رشته ورودی را به شکل مستقل تبدیل می‌کند. برای رشته‌های چندبایتی (مثل UTF-8) هم بایت‌ها جداگانه هگزی می‌شوند — نه نقاط کد یونیکد.

مثال ساده

<?php
$data = "Hello";
$hex = bin2hex($data);
echo $hex; // 48656c6c6f
?>

توضیح: در این مثال، رشته “Hello” که شامل بایت‌های ASCII است، به نمایش هگزادسیمال تبدیل شده است. هر حرف به دو کاراکتر هگز تبدیل می‌شود: ‘H’ = 0x48، ‘e’ = 0x65 و … . نتیجهٔ تابع یک رشتهٔ متنی است.

کاربردها و سناریوهای عملی

  • ذخیرهٔ امن یا متنی کردن داده‌های باینری در پایگاه داده‌هایی که فیلد باینری ندارند یا راحتی نمایش لازم است.
  • تولید توکن‌های تصادفی برای لینک فعال‌سازی یا تعیین شناسهٔ بی‌پیش‌فرض با random_bytes() یا openssl_random_pseudo_bytes().
  • دیباگ کردن محتویات باینری (مثلاً هدر فایل‌ها، محتوای تصویر یا پروتکل‌های باینری).
  • ارسال بایت‌ها در محیط‌هایی که فقط متن مجاز است (مثلاً داخل URL یا فایل لاگ) — البته باید URL-encode یا encode دیگری نیز اعمال شود اگر لازم باشد.

مثال: تولید توکن امن

<?php
$bytes = random_bytes(16);       // 16 بایت تصادفی
$token = bin2hex($bytes);        // تبدیل به رشته هگز 32 کاراکتری
echo $token;
?>

توضیح: این روش رایج برای تولید شناسه‌های تصادفی است. با 16 بایت تصادفی، خروجی 32 کاراکتر هگز می‌شود. از آنجا که bin2hex نمایش متنی ارائه می‌دهد، ذخیره و ارسال توکن ساده‌تر است. توجه داشته باشید که امنیت تصادفی وابسته به تابع تولید بایت‌ها (مثل random_bytes) است نه خود bin2hex.

معکوس‌سازی با hex2bin() و نکات مرتبط

<?php
$hex = "48656c6c6f";
$binary = hex2bin($hex);
if ($binary === false) {
    echo "فرمت هگز نامعتبر است.";
} else {
    echo $binary; // Hello
}
?>

توضیح: برای بازگرداندن رشته باینری از هگز از تابع hex2bin() استفاده می‌شود. اگر رشتهٔ هگز طول فرد (odd) داشته باشد یا شامل کاراکترهای غیرمجاز باشد، این تابع مقدار false برمی‌گرداند و هشدار (warning) ممکن است صادر شود. بنابراین همیشه باید مقدار بازگشتی را چک کنید.

مقایسه با base64_encode

ویژگیbin2hex()base64_encode()
نسبت اندازهدو برابر بایت‌ها (هر بایت => 2 کاراکتر)حدود 4/3 برابر بایت‌ها (افزایش ~33%)
خواناییقابل‌فهم برای تحلیل بایت‌ها، کمتر فشردهفشرده‌تر ولی حاوی مجموعه کاراکتر متفاوت
سازگاری URLخوب (کاراکترهای 0-9 a-f)نیاز به urlencode یا strtr برای برخی سناریوها

توضیح: اگر محدودیت اندازه دارید یا نیاز به بازدهی فضا است، base64 معمولاً مناسب‌تر است. اگر بخواهید نمایش دقیق هر بایت را ببینید یا رشتهٔ یکنواخت حروف هگز لازم دارید، bin2hex انتخاب خوبی است.

بهینه‌سازی و کار با فایل‌های بزرگ

اگر می‌خواهید فایل بزرگ یا استریم باینری را به هگز تبدیل کنید، بهتر است از خواندن به‌صورت chunk و تبدیل هر بخش استفاده کنید تا حافظهٔ زیادی مصرف نشود:

<?php
$fp = fopen('large.bin', 'rb');
while (!feof($fp)) {
    $chunk = fread($fp, 8192);   // خواندن 8KB
    echo bin2hex($chunk);
}
fclose($fp);
?>

توضیح: این روش از حافظهٔ اضافی جلوگیری می‌کند و امکان پردازش فایل‌های بسیار بزرگ را فراهم می‌آورد. توجه کنید که از اندازهٔ مناسب chunk استفاده کنید و اگر خروجی را در شبکه می‌فرستید، ممکن است نیاز به بافرینگ یا فلاش کردن (flush) داشته باشید.

نکات فنی و خطاهای رایج

  • bin2hex خروجی‌ای قابل بازیابی با hex2bin() می‌دهد به شرطی که رشتهٔ هگز کامل و معتبر باشد.
  • برای رشته‌های UTF-8، نتیجهٔ bin2hex هگز بایت‌ها است نه کدپوینت‌ها. برای تبدیل رشتهٔ یونیکد به نمایش کدپوینت باید از روش‌های دیگر استفاده شود.
  • برای ذخیرهٔ دادهٔ حساس (مانند رمز عبور)، نباید از bin2hex یا ذخیرهٔ باینری خام استفاده کنید — از توابع هش امن مانند password_hash() استفاده کنید.
  • hex2bin برای ورودی با طول فرد یا کاراکترهای نامعتبر false برمی‌گرداند؛ همیشه خروجی را بررسی کنید.

مثال پیشرفته: استفادهٔ ترکیبی pack/unpack

<?php
// معادل bin2hex با unpack
$data = "ABC";
$hexArr = unpack('H*', $data);
$hex = array_shift($hexArr); // 414243

// معکوس با pack
$binary = pack('H*', $hex); // "ABC"
?>

توضیح: توابع pack و unpack کنترل بیشتری روی قالب‌بندی بایت‌ها می‌دهند و در بعضی موقعیت‌ها جایگزین مناسب یا مکمل bin2hex/hex2bin هستند.

خلاصه و توصیه‌های نهایی

تابع bin2hex() ابزار ساده و قدرتمندی برای تبدیل دادهٔ باینری به متن هگزادسیمال است. کاربردهای آن در تولید توکن‌ها، نمایش بایت‌ها برای دیباگ و ذخیرهٔ متنی داده‌های باینری است. هنگام استفاده به مسائل اندازهٔ خروجی، تبدیل معکوس با hex2bin() و تفاوت با base64 توجه کنید. برای داده‌های حساس، از مکانیزم‌های رمزنگاری و هش مناسب استفاده نمایید.

آیا این مطلب برای شما مفید بود ؟

خیر
بله
موضوعات شما در انجمن: