نحوه کار تبدیل مبنا
هر سیستم اعداد موضعی یک مقدار را به عنوان مجموع ارقام ضربدر توانهای مبنا نمایش میدهد. تغییر مبنا به معنای بازنویسی همان مقدار بر اساس یک سری توان متفاوت است.
- اعتبارسنجی الفبای ورودی. هر مبنا مجموعه ارقام خاصی قبول میکند. باینری ۰ و ۱ قبول میکند؛ اکتال ۰-۷ قبول میکند؛ دسیمال ۰-۹ قبول میکند؛ هگز ۰-۹ و A-F قبول میکند. یک کاراکتر خارج از الفبای انتخابی یک خطای inline قبل از اجرای هر تبدیل نمایش میدهد.
- تجزیه مقدار. برای مقادیری که در یک Number JavaScript جا میشوند (تا ۲^۵۳-۱) ابزار
parseInt(text, base)را فراخوانی میکند. بالای آن مرز بهBigIntبرمیگردد تا تبدیل برای اعداد صحیح دلخواه بزرگ دقیق بماند. - رندر مجدد در هر مبنای هدف. مقدار تجزیهشده از طریق
Number.prototype.toString(base)یاBigInt.prototype.toString(base)به هر مبنای خروجی تبدیل میشود. چهار پانل استاندارد (باینری، اکتال، دسیمال، هگز) و پانل مبنای سفارشی با هم بهروز میشوند. - اعمال قالببندی. یک تاگل پیشوند، 0b، 0o یا 0x را به ابتدای خروجی باینری، اکتال و هگز اضافه میکند. گروهبندی ارقام هر چهار رقم باینری و هر دو رقم هگز یک زیرخط درج میکند. یک تاگل حروف هگز حروف بزرگ یا کوچک برای A-F انتخاب میکند.
- همگامسازی زنده بین پانلها. ویرایش هر پانل یک تبدیل مجدد با ۱۰۰ میلیثانیه debounce را فعال میکند که پانلهای دیگر را بهروز میکند. پانلی که در آن تایپ میکنید در هر ضربه کلید به عنوان منبع اصلی در نظر گرفته میشود.
چرا از مبدل مبنا استفاده کنیم
- خواندن dump های حافظه. دیباگرها، disassembler ها و بینندگان core-dump آدرسها و مقادیر register را در هگز نمایش میدهند. ترجمه آنها به دسیمال آنها را با تعدادها، اندازهها و offset های گزارششده در جای دیگر در همان trace قابلمقایسه میکند.
- کار با کدهای رنگ. CSS، ابزارهای طراحی و فرمتهای تصویر رنگها را در مثلثهای هگز مانند #d2511a مینویسند. تبدیل هر جفت به دسیمال همان رنگ را به فرم rgb(210, 81, 26) که color picker یا ابزار بررسی دسترسیپذیری شما انتظار دارد تبدیل میکند.
- رمزگشایی مجوزهای فایل. مقادیر chmod در Unix به صورت اکتال نوشته میشوند: ۷۵۵ به معنای rwxr-xr-x است وقتی هر رقم اکتال را به سه بیت باینری ترجمه کنید. مبدل این نگاشت را در یک مرحله نشان میدهد تا بتوانید یک مجموعه مجوز را بدون مراجعه به man page بررسی کنید.
- اشکالزدایی flag های bit. پروتکلهای شبکه، syscall های هسته و register های سختافزار flag های بولین زیادی را در یک عدد صحیح بستهبندی میکنند. خواندن عدد صحیح در باینری نشان میدهد کدام بیتها تنظیم شدهاند، که همان چیزی است که هنگام بررسی اینکه چرا یک flag اثر نمیگذارد نیاز دارید.
کاربردهای رایج
تبدیل مبنا در کار روزمره توسعهدهندگان، امنیت و سختافزار هر بار که یک عدد بیشتر از یک شمارنده است ظاهر میشود.
- firmware جاسازیشده: یک hex dump از یک پروب JTAG بخوانید، آدرس یک تابع را پیدا کنید، و یک دستور breakpoint با استفاده از offset دسیمال که اسکریپت دیباگر شما قبول میکند بنویسید.
- امنیت شبکه: یک netmask 32 بیتی چاپشده در dotted-decimal را به باینری برگردانید تا طول پیشوند را بشمارید، سپس فرم CIDR را برای یک قانون ACL بنویسید.
- پازلهای CTF و چالشهای رمزنگاری: بین هگز، دسیمال و باینری جابجا شوید در حالی که یک fragment کلید فاششده را با یک plaintext کاندید تحت XOR مقایسه میکنید.
یک مثال عملی
عدد 255 را در پانل دسیمال تایپ کنید. پانل هگز به FF (یا 0xFF با تاگل پیشوند روشن) بهروز میشود، پانل باینری به 11111111 (گروهبندیشده به عنوان 1111_1111)، و پانل اکتال به 377. مبنای پانل سفارشی را به ۳۶ تغییر دهید و همان مقدار به عنوان 73 نمایش داده میشود. یک مقدار بسیار بزرگتر مانند 123456789012345678901234567890 را در پانل دسیمال تایپ کنید؛ پانل هگز از مسیر BigInt استفاده میکند و 18EE90FF6C373E0EE4E3F0AD2 نمایش میدهد.
FAQ
مبنای عدد چیست؟
مبنای عدد، یا radix، تعداد ارقام متمایزی است که یک سیستم موضعی قبل از رفتن به موضع بعدی استفاده میکند. دسیمال (مبنای ۱۰) از ۰-۹ استفاده میکند؛ باینری (مبنای ۲) فقط از ۰ و ۱ استفاده میکند؛ هگزادسیمال (مبنای ۱۶) از ۰-۹ به علاوه A-F استفاده میکند. مقدار یک عدد وقتی مبنا را تغییر میدهید تغییر نمیکند — فقط نحوه نوشتن و گروهبندی ارقام آن تغییر میکند.
چرا در برنامهنویسی از هگزادسیمال استفاده میشود؟
یک رقم هگز به دقیقاً چهار بیت باینری نگاشت میشود، بنابراین دو رقم هگز یک بایت و هشت رقم هگز یک کلمه ۳۲ بیتی را پوشش میدهد. این هگز را فشردهترین فرم خوانا برای انسان برای آدرسهای حافظه، محتویات register، مثلثهای رنگ و کلیدهای رمزنگاری میکند. خواندن 0xFF سریعتر از خواندن 11111111 است، و الگوی bit همان جاست اگر به آن نیاز داشتید.
آیا میتوانم بیشتر از مبنای ۳۶ تبدیل کنم؟
این ابزار در مبنای ۳۶ متوقف میشود چون این حد بالای API های بومی JavaScript parseInt و toString است که ۰-۹ به دنبال A-Z را به عنوان الفبای رقمی قبول میکنند. مبناهای ۳۷-۶۲ با یک الفبای سفارشی ممکن هستند (Base58 استفادهشده در آدرسهای Bitcoin یک مثال است) اما به عنوان یک ابزار جداگانه پیگیری میشوند چون هر مبنای بالاتر به ترتیب ارقام کانونیک خودش نیاز دارد.
آیا اعداد منفی و اعشاری پشتیبانی میشوند؟
اعداد صحیح منفی با یک علامت منها پیشرو در هر مبنا نمایش داده میشوند، همان رفتاری که Number.prototype.toString ارائه میدهد. نمایش مکمل دو در یک پهنای bit انتخابی (۸، ۱۶، ۳۲، ۶۴) یک نمای جداگانه است که قصد داریم اضافه کنیم. تبدیل مبنای ممیز شناور نیز خارج از حوزه این نسخه است؛ ابزار فقط مقادیر صحیح را مدیریت میکند.
تبدیل مبنا یک کار کوچک است که بارها در firmware، امنیت و کار گرافیکی ظاهر میشود. انجام آن در یک تب مرورگر، با همان عوامل اولیه حسابی که Node و V8 ارائه میدهند، کار را سریع نگه میدارد و دادهها را روی دستگاه شما.