نحوه عملکرد رمزگذاری hex
هر کاراکتر در یک صفحه بهصورت یک یا چند بایت ذخیره میشود. رمزگذاری hex آن بایتها را در مبنای ۱۶، دو کاراکتر به ازای هر بایت بازنویسی میکند، بنابراین جریان بایت بدون ابزار خاصی قابل خواندن است.
- رمزگذاری متن به بایتها. حالت UTF-8 ورودی را از طریق
new TextEncoder().encode(text)اجرا میکند که یکUint8Arrayاز مقادیر بایت برمیگرداند. حالت Latin-1 هشت بیت پایین هر code unit را از طریقcharCodeAt(0) & 0xFFمیگیرد، که همان تبدیلی است که codex های ISO-8859-1 قدیمی انجام میدهند. - رندر هر بایت بهصورت دو رقم hex. هر بایت از طریق
byte.toString(16).padStart(2, "0")به دو رقم hex نگاشت میشود. تغییر حالت حروف بین بزرگ (A-F) یا کوچک (a-f) در حروف خروجی انتخاب میکند. - اعمال گروهبندی و پیشوند. گروهبندی یک جداکننده بین بایتها قرار میدهد: یک فاصله واحد، یک خط تیره، یا یک فاصله هر چهار بایت. پیشوند 0x میتواند یک بار به کل رشته (گروهبندی هیچ) یا به ازای هر بایت (گروهبندی فاصله) اضافه شود، منطبق بر قراردادهایی که آرایههای C و ابزارهای diff باینری انتظار دارند.
- رمزگشایی در جهت معکوس. حالت Hex → Text هر فاصله، خط تیره و پیشوند
0xرا از ورودی جدا میکند، کاراکترهای باقیمانده را در برابر/^[0-9a-fA-F]+$/اعتبارسنجی میکند، رشتههای با طول فرد را رد میکند و از جفتهای متوالی بایت یکUint8Arrayبازسازی میکند. حالت UTF-8 آن آرایه را باnew TextDecoder("utf-8", { fatal: true })رمزگشایی میکند؛ حالت Latin-1 هر بایت را بهString.fromCharCode(b)نگاشت میکند. - حالت زنده برای تکرار سریع. حالت زنده بهطور پیشفرض روشن است. هر ضربه کلید یک تبدیل مجدد debounce شده با تأخیر ۱۵۰ میلیثانیه زمانبندی میکند تا بتوانید الصاق، ویرایش و تماشای بهروزرسانی پنل دیگر را بدون کلیک روی دکمه تبدیل انجام دهید.
چرا از یک مبدل hex استفاده کنیم
- اشکالزدایی پروتکلهای باینری. فرمتهای سیمی مثل Modbus، DNP3 و CoAP سرآیندهای خود را در offset های بایت خاص میبندند. خواندن یک فریم ضبطشده بهصورت hex هر فیلد را در یک نگاه نشان میدهد، و برگرداندن همان بایتها به ASCII هر بار محتوای متنی ساده که کنار فریمبندی باینری پنهان شده را آشکار میکند.
- کار با firmware تعبیهشده. پروبهای JTAG و SWD محتوای حافظه را بهصورت hex گزارش میدهند. ترجمه یک ناحیه از حافظه به ASCII رشتههای تعبیهشده (مسیر فایلها، پیامهای خطا، امضاهای vendor) را پیدا میکند که اغلب نشان میدهد کجای firmware نگاه میکنید.
- خواندن ضبطهای بسته. Wireshark و tcpdump هر دو یک پنل بایت دارند که هر بسته را بهصورت hex در سمت چپ و ASCII در سمت راست چاپ میکنند. تبدیل یک قطعه اینجا به شما امکان میدهد یک blob hex را از یک گزارش باگ یا لاگ چت کپی کرده و بدون واردکردن مجدد آن به یک ابزار ضبط بخوانید بایتها واقعاً چه میگویند.
- diffهای سطح بایت. مقایسه دو فایل باینری اغلب به تشخیص تغییر کدام بایتها برمیگردد. تبدیل هر دو طرف به hex با گروهبندی ثابت diff را در یک ویرایشگر متن تراز میکند، جایی که یک ابزار diff داخلی میتواند بایتهای تغییریافته را برجسته کند.
کاربردهای رایج
تبدیل Hex ↔ ASCII در سراسر مهندسی معکوس، امنیت و کار تعبیهشده هر زمان که یک جریان بایت فراتر از یک payload متنی ساده است ظاهر میشود.
- مهندسی معکوس: یک hex dump از یک باینری مقاوم در برابر strings بگیرید، دنبالههایی که به ASCII قابل چاپ رمزگشایی میشوند را انتخاب کنید و از آن رشتهها برای مستقر کردن جایگاه خود در disassembly استفاده کنید.
- جرمشناسی شبکه: یک payload بسته واحد را از Wireshark بهصورت hex کپی کنید، اینجا الصاق کنید و متن لایه کاربردی را بدون صادرکردن کل ضبط بخوانید.
- مدیریت مواد رمزنگاری: یک کلید، IV یا تگ HMAC اغلب بهصورت یک رشته hex ارسال میشود. رمزگشایی به بایتها تأیید میکند طول با الگوریتم مطابقت دارد (۱۶ بایت برای AES-128، ۳۲ برای AES-256) پیش از اینکه در یک تنظیم وایر کنید.
یک مثال عملی
متن → Hex، UTF-8، حروف کوچک، گروهبندی فاصله-بین-هر-بایت، پیشوند خاموش را انتخاب کنید. Hi را تایپ کنید: خروجی 48 69 میخواند. پیشوند را روشن و گروهبندی را به هیچ تغییر دهید و همان ورودی بهصورت 0x4869 رندر میشود. ایموجی 😀 را بهعنوان ورودی الصاق کنید و حالت UTF-8 f0 9f 98 80 رندر میکند — چهار بایت برای یک code point، که به همین دلیل ایموجیها اغلب اندازه انتقال را زیاد میکنند. به Hex → Text سوئیچ کنید و 0x48-65-6C 6C 6F را الصاق کنید: پارسر پیشوند، خط تیرهها و فاصلهها را جدا کرده و Hello را بازسازی میکند.
FAQ
رمزگذاری hex چیست؟
رمزگذاری hex (یا رمزگذاری هگزادسیمال) یک جریان بایت را در مبنای ۱۶، دو کاراکتر ASCII به ازای هر بایت مینویسد. هر رقم hex چهار بیت را پوشش میدهد، بنابراین دو رقم یک بایت هشتبیتی را پوشش میدهند. الفبا از 0-9 سپس A-F (یا a-f) است؛ حالت حروف صرفاً یک انتخاب نمایشی است و rمزگشاها هر دو را قبول میکنند. Hex روش استانداردی است برای نوشتن بایتهای خام در مشخصات پروتکل، خروجی debugger و کلیدهای رمزنگاری چون دو برابر فشردهتر از باینری است و مشکلات کاراکترهای غیرقابل چاپ در بایتهای خام را ندارد.
چرا ایموجی من در hex به ۴ بایت تبدیل میشود؟
UTF-8 یک رمزگذاری با طول متغیر است. کاراکترهای ASCII (U+0000 تا U+007F) یک بایت، افزونههای Latin-1 دو بایت، بیشتر نقاط کد BMP دیگر سه بایت و کاراکترهای بالاتر از U+FFFF — از جمله بیشتر ایموجیها — چهار بایت میگیرند. چهره خندان 😀 U+1F600 است و به F0 9F 98 80 رمزگذاری میشود. اگر به یک نمای بایت با عرض ثابت نیاز دارید، به Latin-1 سوئیچ کنید — اما Latin-1 فقط ۲۵۶ نقطه کد اول را پوشش میدهد، بنابراین هر کاراکتر خارج از آن محدوده نمیتواند برگشتپذیر باشد.
آیا Latin-1 / ISO-8859-1 پشتیبانی میشود؟
بله. گزینه رمزگذاری متن را به Latin-1 (ISO-8859-1) تغییر دهید. رمزگذاری هشت بیت پایین هر JavaScript code unit را میگیرد (charCodeAt(0) & 0xFF)، که با نگاشت تکبایتی قدیمی مطابقت دارد. رمزگشایی String.fromCharCode(byte) را برای هر بایت استفاده میکند. از Latin-1 زمانی استفاده کنید که با خروجی از سیستمهای قدیمی Windows-1252 یا پیش-یونیکد کار میکنید که در آن هر بایت دقیقاً یک کاراکتر را نشان میدهد.
آیا تبدیل در مرورگر من انجام میشود؟
بله. مبدل TextEncoder، TextDecoder و یک پارسر کوچک را بهعنوان یک صفحه استاتیک واحد اجرا میکند. هیچ آپلود، فراخوانی API یا آنالیتیک در مورد آنچه الصاق میکنید وجود ندارد — فقط معیارهای بارگذاری صفحه استاندارد که در سراسر سایت به اشتراک گذاشته میشود. همان بایتهای hex که اینجا میبینید همان چیزی است که یک اسکریپت Node یا یک تابع Lambda در برابر همان ورودی تولید میکند.
تبدیل Hex ↔ ASCII یک کار کوچک است که هر کسی که پروتکلهای باینری یا firmware تعبیهشده میخواند روزانه چندین بار انجام میدهد. انجام آن در یک تب مرورگر، با همان encoderهای بومی که Node و V8 از قبل دارند، کار را سریع و جریان بایت را روی دستگاه شما نگه میدارد.