هل سبق لك أن رأيت صلاحية ملف مثل chmod 755 وتساءلت كيف يقرأها الحاسوب فعلياً؟ أو لاحظت أن عناوين الذاكرة في أدوات التنقيح تظهر بصيغة hex مثل 0x1FF؟ خلف الكواليس، يُعدّ التحويل من النظام الثماني إلى النظام الست عشري عملية صغيرة لكنها بالغة الأهمية، إذ تربط بين نظامَي ترقيم يُستخدمان باستمرار في العمل البرمجي الفعلي. سواء كنت تكتب سكريبتات shell، أو تقرأ تفريغات الذاكرة، أو تتعامل مع كود قديم، فإن إتقان تحويل الأعداد الثمانية إلى ست عشرية بدقة وسرعة مهارة تستحق الاستثمار. يشرح هذا الدليل العملية بالكامل خطوة بخطوة، مع أمثلة حقيقية وكود بلغتَي Python و C، وشرح مبسّط يفهمه أي مطوّر.
جدول المحتويات
أبرز النقاط:
- النظام الثماني (أساس 8) والنظام الست عشري (أساس 16) كلاهما اختصار للنظام الثنائي، والتحويل بينهما يمرّ دائماً عبر النظام العشري أو الثنائي كخطوة وسيطة.
- أسرع طريقة هي: ثماني إلى ثنائي (3 بتات لكل رقم)، ثم ثنائي إلى ست عشري (4 بتات لكل مجموعة).
- Python تنجز هذا في سطر واحد، بينما تحتاج C إلى خطوات أكثر لكنها تمنحك تحكماً كاملاً.
- تشمل الاستخدامات الفعلية: صلاحيات ملفات Unix، وأكواد الألوان، وعناوين الذاكرة في الأنظمة المدمجة.
لماذا تهمّنا أنظمة الترقيم في البرمجة
الحاسوب لا يفهم إلا النظام الثنائي (الصفر والواحد). لكن كتابة سلاسل طويلة من الأرقام الثنائية أمر مرهق للمبرمجين. لذلك يلجأون إلى أنظمة ترقيم مختصرة تجعل الكود أكثر قابلية للقراءة. أنظمة الترقيم في البرمجة كالنظام الثماني (أساس 8) والنظام الست عشري (أساس 16) ما هي إلا طرق مضغوطة لتمثيل البيانات الثنائية.
كان النظام الثماني شائعاً في أنظمة Unix القديمة لأنه يجمع البتات الثنائية في مجموعات من 3، وهو ما يتوافق بشكل طبيعي مع أعلام الصلاحيات (قراءة، كتابة، تنفيذ). أما النظام الست عشري فقد أصبح السائد في الأنظمة الحديثة لأنه يجمع البتات في مجموعات من 4، وهو ما يتطابق تماماً مع بنية البايت ذات الـ 8 بتات في الأجهزة الحديثة. اليوم، كثيراً ما تجد نفسك بحاجة إلى تحويل الأعداد الثمانية إلى ست عشرية عند ربط الكود القديم بالأدوات الحديثة، أو عند تحليل بيانات النظام على المستوى المنخفض.
فهم تحويل الأسس العددية بشكل عام يساعدك أيضاً في مهام مشابهة. فمثلاً إن كنت تتعامل مع قيم الألوان، قد تحتاج إلى تحويل الأعداد العشرية إلى ست عشرية أو حتى تحويل hex إلى RGB لألوان CSS.
النظام الثماني والست عشري بشكل مبسّط
ما هو النظام الثماني (أساس 8)؟
يستخدم النظام الثماني ثمانية أرقام فقط: 0, 1, 2, 3, 4, 5, 6, 7. عندما تتجاوز الرقم 7، تنتقل إلى الخانة التالية، تماماً كما يحدث في النظام العشري بعد الرقم 9. إذن، الرقم 10 في النظام الثماني يساوي 8 في النظام العشري. في الكود، تُكتب الأعداد الثمانية غالباً بصفر في البداية، مثل 0755 في صلاحيات ملفات Unix.
ما هو النظام الست عشري (أساس 16)؟
يستخدم النظام الست عشري 16 رمزاً: 0-9 ثم A, B, C, D, E, F للقيم من 10 إلى 15. رقم ست عشري واحد يمثّل 4 بتات ثنائية بالضبط (ما يُعرف بـ "nibble"). رقمان ست عشريان يمثّلان بايتاً كاملاً. لهذا السبب تستخدم عناوين الذاكرة وأكواد الألوان مثل #FF5733 النظام الست عشري - فهو مضغوط ويتوافق مباشرة مع طريقة تخزين الحاسوب للبيانات.
الجسر الرابط: النظام الثنائي
أنظف مسار بين النظام الثماني والست عشري يمرّ عبر النظام الثنائي. كلا النظامين من قوى العدد 2 (2^3 = 8 و 2^4 = 16)، لذا فالنظام الثنائي هو الجسر الطبيعي بينهما. لا حاجة للمرور بالنظام العشري أصلاً، مما يتجنّب أي تعقيدات أو أخطاء غير ضرورية.
خطوات تحويل الأعداد الثمانية إلى ست عشرية
إليك الطريقة الاحترافية المكوّنة من خطوتين لتحويل الأعداد الثمانية إلى ست عشرية باستخدام النظام الثنائي كجسر.
الطريقة: ثماني ← ثنائي ← ست عشري
- اكتب كل رقم ثماني كمجموعة ثنائية من 3 بتات. كل رقم ثماني يقابل بالضبط 3 بتات ثنائية.
- ادمج جميع البتات في سلسلة واحدة. احذف الأصفار الزائدة في البداية.
- قسّم السلسلة الثنائية إلى مجموعات من 4 بتات بدءاً من اليمين. أضف أصفاراً على اليسار عند الحاجة.
- حوّل كل مجموعة من 4 بتات إلى رقمها الست عشري المقابل.
مثال تطبيقي: تحويل الثماني 755 إلى ست عشري
هذه هي قيمة صلاحية Unix الكلاسيكية التي تعني "rwxr-xr-x".
الخطوة 1 - تحويل كل رقم ثماني إلى ثنائي من 3 بتات:
7=1115=1015=101
الخطوة 2 - دمج البتات: 111 101 101 تصبح 111101101
الخطوة 3 - تقسيمها إلى مجموعات من 4 بتات من اليمين: 1 1110 1101 - أضف أصفاراً للمجموعة الأولى: 0001 1110 1101
الخطوة 4 - تحويل كل مجموعة من 4 بتات:
0001=11110=E1101=D
النتيجة: الثماني 755 = الست عشري 1ED
مثال ثانٍ: تحويل الثماني 644 إلى ست عشري
هذه هي الصلاحية القياسية للملفات القابلة للقراءة (rw-r--r--).
6=1104=1004=100
الدمج: 110100100 - التقسيم من اليمين: 0001 1010 0100
0001=11010=A0100=4
النتيجة: الثماني 644 = الست عشري 1A4
هل تحتاج إلى العكس؟ استخدم محوّل hex إلى ثماني للعملية العكسية.
أمثلة من الواقع العملي
1. صلاحيات الملفات في Unix
حين تشغّل أمر ls -l على نظام Linux، تُخزَّن الصلاحيات مثل rwxr-xr-x داخلياً بالنظام الثماني 0755. بعض أدوات الأمان ومحللات السجلات تعرض هذه القيم بالنظام الست عشري. معرفة أن 0755 ثماني تساوي 1ED ست عشري يتيح لك قراءة تلك السجلات دون لبس.
2. عناوين الذاكرة في الأنظمة المدمجة
استخدمت بعض وحدات التحكم المصغّرة القديمة (كشرائح PIC الأولى) العنونة الثمانية في صفحات البيانات الخاصة بها. أما أدوات التنقيح الحديثة فتعرض العناوين بالنظام الست عشري. إن كنت تنقل برامج ثابتة من منصة قديمة، ستحتاج إلى تحويل الأعداد الثمانية إلى ست عشرية لمطابقة عناوين السجلات بشكل صحيح.
3. قيم الألوان
رغم أن ألوان CSS تستخدم النظام الست عشري (مثل #FF5733)، تُخرج بعض أدوات الرسومات القديمة قيم قنوات الألوان بالنظام الثماني. على سبيل المثال، قيمة اللون الثمانية 377 تتحوّل إلى FF ست عشري، وهي القيمة القصوى (255 عشري) لقناة اللون. هذا يرتبط مباشرة بطريقة تعامل أكواد الألوان الست عشرية مع قيم RGB.
4. بيانات الشبكات والبروتوكولات
تستخدم بعض مواصفات بروتوكولات الشبكات وملفات RFC القديمة التدوين الثماني لقيم البايتات. تحويل هذه القيم إلى النظام الست عشري يجعل مقارنتها مع التقاطات الحزم في أدوات مثل Wireshark أسهل بكثير، إذ تعرض Wireshark البايتات دائماً بالنظام الست عشري.
أمثلة كود بلغتَي Python و C
تحويل الثماني إلى ست عشري في Python
تجعل Python عملية تحويل الأعداد الثمانية إلى ست عشرية بسيطة للغاية. يمكنك إنجازها في سطر واحد باستخدام الدوال المدمجة.
# الطريقة الأولى: سطر واحد باستخدام int() و hex()
octal_value = "755"
hex_result = hex(int(octal_value, 8))
print(hex_result) # المخرج: 0x1ed
# الطريقة الثانية: حروف كبيرة ومخرج نظيف
hex_clean = hex(int(octal_value, 8))[2:].upper()
print(hex_clean) # المخرج: 1ED
# الطريقة الثالثة: دالة قابلة لإعادة الاستخدام
def octal_to_hex(octal_str):
try:
decimal_value = int(octal_str, 8) # تحليل كأساس 8
return hex(decimal_value)[2:].upper()
except ValueError:
return "إدخال ثماني غير صالح"
# اختبار بقيم صلاحيات حقيقية
print(octal_to_hex("755")) # 1ED
print(octal_to_hex("644")) # 1A4
print(octal_to_hex("777")) # 1FF
المفتاح هو int(octal_str, 8) الذي يخبر Python بتحليل السلسلة كأساس 8. ثم تحوّل hex() ذلك العدد الصحيح إلى ست عشري. الشريحة [2:] تزيل البادئة 0x.
تحويل الثماني إلى ست عشري في C
في C، تتعامل مع التحويل يدوياً باستخدام strtol للتحليل و printf للتنسيق.
#include <stdio.h>
#include <stdlib.h>
int main() {
char octal_input[] = "755";
long decimal_value;
char hex_output[20];
// strtol مع الأساس 8 يحلّل السلسلة الثمانية
decimal_value = strtol(octal_input, NULL, 8);
// %lX يُنسّق كست عشري بأحرف كبيرة
snprintf(hex_output, sizeof(hex_output), "%lX", decimal_value);
printf("Octal %s = Hex %s\n", octal_input, hex_output);
// المخرج: Octal 755 = Hex 1ED
// مثال على التحويل الجماعي
char *permissions[] = {"755", "644", "777", "600"};
int count = 4;
printf("\nجدول تحويل الصلاحيات:\n");
for (int i = 0; i < count; i++) {
long val = strtol(permissions[i], NULL, 8);
printf("Octal %-5s = Hex %lX\n", permissions[i], val);
}
return 0;
}
دالة strtol هي الأداة المثلى هنا لأنها تتعامل مع تحويل الأساس بشكل مدمج وأكثر أماناً من التحليل اليدوي. محدّد التنسيق %lX يُخرج الست عشري بأحرف كبيرة.
لتحويلات أخرى ذات صلة في مشاريعك، قد تحتاج أيضاً إلى الثماني إلى ثنائي أو الثنائي إلى ست عشري كخطوات وسيطة.
جدول تحويل سريع للمرجعية
إليك قيم ثمانية شائعة مع مقابلاتها العشرية والست عشرية للرجوع إليها بسرعة:
| ثماني | عشري | ست عشري | الاستخدام الشائع |
|---|---|---|---|
777 |
511 | 1FF |
صلاحيات كاملة (rwxrwxrwx) |
755 |
493 | 1ED |
صلاحية التنفيذ القياسية |
644 |
420 | 1A4 |
صلاحية الملف القياسية |
600 |
384 | 180 |
ملف خاص (المالك فقط) |
377 |
255 | FF |
أقصى قيمة لبايت واحد |
10 |
8 | 8 |
أول تجاوز في النظام الثماني |
للاطلاع على تفاصيل أعمق حول تفاعل هذه الأنظمة العددية مع بعضها، يوفّر مقال ويكيبيديا عن النظام الثماني مرجعاً شاملاً يتضمن السياق التاريخي لسبب استخدام هذا النظام في أجهزة الحوسبة المبكرة.
الخلاصة
تحويل الأعداد الثمانية إلى ست عشرية من تلك الأساسيات التي تبدو مربكة في البداية لكنها تصبح طبيعية جداً بسرعة. الحيلة الجوهرية دائماً واحدة: استخدم النظام الثنائي كجسر. كل رقم ثماني يتحوّل إلى 3 بتات، ثم تعيد تجميعها في مجموعات من 4 بتات، وكل مجموعة تصبح رقماً ست عشرياً. Python تنجز هذا في سطر واحد أنيق، وC تمنحك تحكماً دقيقاً عبر strtol. سواء كنت تصحّح أخطاء في الصلاحيات، أو تحلّل الذاكرة، أو تنقل كوداً قديماً، فهذه المهارة تُزيل الاحتكاك من سير عملك وتجعلك مطوّراً أكثر ثقة وكفاءة.
حوّل الأعداد الثمانية إلى ست عشرية فوراً - أداة مجانية
تخطَّ الخطوات اليدوية. الصق أي قيمة ثمانية واحصل على النتيجة الست عشرية في الحال، دون إعداد أو تثبيت.
جرّب محوّل الأعداد الثمانية إلى ست عشرية المجاني ←
تستخدم الأنظمة والأدوات المختلفة أسساً عددية متباينة. صلاحيات ملفات Unix تُكتب بالنظام الثماني، بينما تعرض أدوات التنقيح ومحللات الذاكرة وواجهات API الحديثة القيم بالنظام الست عشري. التحويل بينهما يتيح لك مقارنة البيانات واستخدامها عبر هذه البيئات دون أخطاء أو سوء تفسير.
أكثر الحالات شيوعاً تشمل: قراءة قيم صلاحيات ملفات Unix في سجلات الأمان، ونقل البرامج الثابتة من وحدات التحكم القديمة التي استخدمت العنونة الثمانية، وتحليل مواصفات بروتوكولات الشبكات القديمة، وتحويل قيم قنوات الألوان من أدوات الرسومات التي تُخرج بالنظام الثماني.
يُنجز محوّل الأعداد الثمانية إلى ست عشرية المجاني لدينا التحويل فوراً دون أي إعداد مسبق. وهو مثالي للبحث السريع والفحص الجماعي والتحقق من حساباتك اليدوية أو مخرجات الكود.
نعم. الطريقة الأكثر كفاءة تتجاوز النظام العشري كلياً. حوّل كل رقم ثماني إلى مجموعة ثنائية من 3 بتات، ادمج البتات، أعد تجميعها في مجموعات من 4 بتات من اليمين، ثم حوّل كل مجموعة إلى رقم ست عشري. هذه الطريقة عبر النظام الثنائي أسرع وأقل عرضة للأخطاء من المرور بالنظام العشري.
لا توجد دالة مخصصة واحدة، لكن يمكنك الجمع بين دالتين مدمجتين: int(value, 8) لتحليل السلسلة الثمانية، و hex() لتنسيق النتيجة كست عشري. يتم التحويل بالكامل في سطر واحد من الكود ويعالج أي إدخال ثماني صالح.