การแปลง Octal เป็น Hex: การใช้งานในโปรแกรมมิ่งและตัวอย่างจริง

Octal to hex conversion guide showing binary bridge method with code examples and number system chart

เคยสงสัยไหมครับว่าคำสั่ง chmod 755 ที่เราพิมพ์กันบ่อยๆ นั้น คอมพิวเตอร์อ่านค่าตรงนี้ยังไง? หรือเวลาเปิด debugger แล้วเห็น memory address แสดงเป็น 0x1FF มันมาจากไหน? จริงๆ แล้วการแปลงเลขฐานแปดเป็นเลขฐานสิบหก (octal to hex) คือกระบวนการเล็กๆ ที่เชื่อมสองระบบตัวเลขที่นักพัฒนาใช้งานจริงทุกวันเข้าหากันครับ ไม่ว่าจะเขียน shell script, อ่าน memory dump, หรือแก้โค้ดระบบเก่า การแปลงค่าระหว่างสองฐานนี้ได้อย่างรวดเร็วและแม่นยำเป็นทักษะที่มีประโยชน์มากครับ บทความนี้จะอธิบายทุกขั้นตอนแบบละเอียด พร้อมตัวอย่างจริง โค้ด Python และ C และคำอธิบายที่เข้าใจง่ายสำหรับทุกคนครับ

สรุปประเด็นสำคัญ:

  • เลขฐานแปด (base-8) และเลขฐานสิบหก (base-16) ต่างก็เป็นการย่อเลขฐานสองให้กระชับขึ้น การแปลงระหว่างสองฐานนี้จึงต้องผ่านเลขฐานสิบหรือเลขฐานสองเป็นตัวกลางเสมอครับ
  • วิธีที่เร็วที่สุดคือ: แปลงฐานแปดเป็นเลขฐานสอง (3 บิตต่อหลัก) แล้วค่อยแปลงเลขฐานสองเป็นฐานสิบหก (กลุ่มละ 4 บิต)
  • Python ทำได้ในบรรทัดเดียว ส่วน C ต้องเขียนเพิ่มอีกนิดหน่อยแต่ควบคุมได้ละเอียดกว่าครับ
  • ใช้งานจริงได้กับ Unix file permissions, รหัสสี, และ memory address ในระบบ embedded ครับ

ทำไมระบบตัวเลขถึงสำคัญในการเขียนโปรแกรม

คอมพิวเตอร์เข้าใจแค่เลขฐานสอง (0 กับ 1) เท่านั้นครับ แต่การเขียนตัวเลขยาวๆ เป็นเลขฐานสองนั้นอ่านยากมากสำหรับมนุษย์ นักพัฒนาจึงใช้ระบบตัวเลขที่กระชับกว่า เช่น เลขฐานแปด (octal) และ เลขฐานสิบหก (hexadecimal) ซึ่งทั้งสองแบบนี้ก็คือวิธีแสดงข้อมูลเลขฐานสองในรูปแบบที่อ่านง่ายขึ้นนั่นเองครับ

เลขฐานแปดเป็นที่นิยมในระบบ Unix ยุคเก่า เพราะมันจัดกลุ่มเลขฐานสองเป็นชุดละ 3 บิต ซึ่งตรงกับ permission flag (อ่าน, เขียน, รัน) พอดีเลยครับ ส่วนเลขฐานสิบหกครองใจระบบสมัยใหม่ เพราะจัดกลุ่มเป็นชุดละ 4 บิต ซึ่งตรงกับโครงสร้าง byte 8 บิตของฮาร์ดแวร์ปัจจุบันพอดีครับ ดังนั้นในชีวิตการทำงานจริง เราจึงมักต้องแปลงเลขฐานแปดเป็นฐานสิบหกเมื่อต้องเชื่อมโค้ดเก่ากับเครื่องมือสมัยใหม่ หรือตอนวิเคราะห์ข้อมูลระดับต่ำของระบบครับ

การเข้าใจ การแปลงฐานตัวเลข โดยรวมยังช่วยได้กับงานที่เกี่ยวข้องด้วยครับ เช่น ถ้าทำงานกับค่าสี อาจต้องใช้ การแปลงเลขฐานสิบเป็นฐานสิบหก หรือแม้แต่ การแปลง hex เป็น RGB สำหรับสีใน CSS ด้วยครับ

ทำความเข้าใจเลขฐานแปดและฐานสิบหกแบบง่ายๆ

เลขฐานแปด (Base-8) คืออะไร?

เลขฐานแปดใช้ตัวเลขแค่ 8 ตัว ได้แก่ 0, 1, 2, 3, 4, 5, 6, 7 ครับ พอนับเกิน 7 ก็จะทดไปหลักถัดไป เหมือนเลขฐานสิบที่ทดหลังจาก 9 ดังนั้น 10 ในฐานแปดจึงเท่ากับ 8 ในฐานสิบครับ ในโค้ด เลขฐานแปดมักเขียนนำหน้าด้วยเลขศูนย์ เช่น 0755 ใน Unix file permissions

เลขฐานสิบหก (Base-16) คืออะไร?

เลขฐานสิบหก (hex) ใช้สัญลักษณ์ 16 ตัว ได้แก่ 0-9 และ A, B, C, D, E, F สำหรับค่า 10 ถึง 15 ครับ หนึ่งหลัก hex แทนเลขฐานสองได้พอดี 4 บิต (เรียกว่า "nibble") สอง hex แทนหนึ่ง byte เต็มๆ นั่นเองครับ นี่คือเหตุผลที่ memory address และรหัสสีอย่าง #FF5733 ใช้ hex เพราะกระชับและตรงกับวิธีที่คอมพิวเตอร์เก็บข้อมูลพอดีครับ

ตัวกลาง: เลขฐานสอง

เส้นทางที่สะอาดที่สุดระหว่างเลขฐานแปดและฐานสิบหกคือผ่านเลขฐานสองครับ เพราะทั้งสองระบบเป็นกำลังของ 2 (2^3 = 8, 2^4 = 16) เลขฐานสองจึงเป็นสะพานเชื่อมที่เป็นธรรมชาติที่สุด และไม่ต้องผ่านเลขฐานสิบเลย ทำให้ไม่มีความสับสนหรือข้อผิดพลาดที่ไม่จำเป็นครับ

วิธีแปลงเลขฐานแปดเป็นฐานสิบหกทีละขั้นตอน

นี่คือวิธีมาตรฐานสองขั้นตอนสำหรับการ แปลงเลขฐานแปดเป็นเลขฐานสิบหก โดยใช้เลขฐานสองเป็นสะพานครับ

วิธี: ฐานแปด → ฐานสอง → ฐานสิบหก

  1. เขียนแต่ละหลักของเลขฐานแปดให้เป็นกลุ่มเลขฐานสอง 3 บิต ทุกหลักในเลขฐานแปดแทนเลขฐานสองได้พอดี 3 บิตครับ
  2. นำบิตทั้งหมดมาต่อกันเป็นสายเดียว แล้วตัดเลขศูนย์ที่นำหน้าออกครับ
  3. แบ่งสายเลขฐานสองออกเป็นกลุ่มละ 4 บิต โดยเริ่มจากด้านขวา ถ้ากลุ่มซ้ายสุดไม่ครบ 4 บิต ให้เติมศูนย์ข้างหน้าครับ
  4. แปลงแต่ละกลุ่ม 4 บิตให้เป็นหลัก hex

ตัวอย่างที่ 1: แปลงเลขฐานแปด 755 เป็น hex

ค่านี้คือ permission ใน Unix แบบ "rwxr-xr-x" ที่คุ้นเคยกันดีครับ

ขั้นตอนที่ 1 - แปลงแต่ละหลักเป็นเลขฐานสอง 3 บิต:

  • 7 = 111
  • 5 = 101
  • 5 = 101

ขั้นตอนที่ 2 - นำบิตมาต่อกัน: 111 101 101 กลายเป็น 111101101

ขั้นตอนที่ 3 - แบ่งกลุ่มละ 4 บิตจากขวา: 1 1110 1101 - เติมศูนย์กลุ่มซ้ายสุด: 0001 1110 1101

ขั้นตอนที่ 4 - แปลงแต่ละกลุ่ม 4 บิตเป็น hex:

  • 0001 = 1
  • 1110 = E
  • 1101 = D

ผลลัพธ์: เลขฐานแปด 755 = hex 1ED

ตัวอย่างที่ 2: แปลงเลขฐานแปด 644 เป็น hex

ค่านี้คือ permission มาตรฐานสำหรับไฟล์ทั่วไป (rw-r--r--) ครับ

  • 6 = 110
  • 4 = 100
  • 4 = 100

ต่อกัน: 110100100 - แบ่งกลุ่มจากขวา: 0001 1010 0100

  • 0001 = 1
  • 1010 = A
  • 0100 = 4

ผลลัพธ์: เลขฐานแปด 644 = hex 1A4

ต้องการแปลงย้อนกลับไหมครับ? ใช้ เครื่องมือแปลง hex เป็นฐานแปด ของเราได้เลยครับ

ตัวอย่างการใช้งานจริง

1. สิทธิ์การเข้าถึงไฟล์ใน Unix

เมื่อรัน ls -l บนระบบ Linux สิทธิ์อย่าง rwxr-xr-x จะถูกเก็บไว้ภายในเป็นเลขฐานแปด 0755 ครับ แต่เครื่องมือด้านความปลอดภัยและโปรแกรมวิเคราะห์ log บางตัวแสดงค่าเหล่านี้เป็น hex การรู้ว่า 0755 ฐานแปดเท่ากับ 1ED hex ทำให้อ่าน log ได้ถูกต้องและไม่สับสนครับ

2. Memory Address ในระบบ Embedded

ไมโครคอนโทรลเลอร์รุ่นเก่า (เช่น PIC chip ยุคแรก) ใช้การกำหนด address แบบเลขฐานแปดใน datasheet ครับ แต่ debugger สมัยใหม่แสดง address เป็น hex ถ้ากำลัง port firmware จากแพลตฟอร์มเก่า การแปลงเลขฐานแปดเป็น hex ช่วยให้จับคู่ register address ได้ถูกต้องครับ

3. ค่าสี

แม้ CSS จะใช้ hex สำหรับสี (เช่น #FF5733) แต่โปรแกรมกราฟิกรุ่นเก่าบางตัวยังแสดงค่าช่องสีเป็นเลขฐานแปดอยู่ครับ ตัวอย่างเช่น ค่าช่องสีฐานแปด 377 แปลงเป็น hex ได้ FF ซึ่งคือค่าสูงสุด (255 ในฐานสิบ) ของช่องสีนั้นๆ ซึ่งเชื่อมโยงโดยตรงกับ การแปลงรหัสสี hex เป็นค่า RGB ครับ

4. ข้อมูลเครือข่ายและโปรโตคอล

ข้อกำหนดโปรโตคอลเครือข่ายบางฉบับและ RFC รุ่นเก่าใช้เลขฐานแปดสำหรับค่า byte ครับ การแปลงค่าเหล่านั้นเป็น hex ทำให้เปรียบเทียบกับข้อมูลที่ดักจับได้ใน Wireshark ได้ง่ายขึ้นมาก เพราะ Wireshark แสดง byte เป็น hex เสมอครับ

ตัวอย่างโค้ดใน Python และ C

แปลงเลขฐานแปดเป็น hex ด้วย Python

Python ทำให้การ แปลงเลขฐานแปดเป็น hex ง่ายมากครับ แค่บรรทัดเดียวโดยใช้ฟังก์ชันในตัวก็พอแล้วครับ

# วิธีที่ 1: บรรทัดเดียวโดยใช้ int() และ hex()
octal_value = "755"
hex_result = hex(int(octal_value, 8))
print(hex_result)  # ผลลัพธ์: 0x1ed

# วิธีที่ 2: แสดงเป็นตัวพิมพ์ใหญ่และตัดคำนำหน้าออก
hex_clean = hex(int(octal_value, 8))[2:].upper()
print(hex_clean)   # ผลลัพธ์: 1ED

# วิธีที่ 3: เขียนเป็นฟังก์ชันสำหรับนำไปใช้ซ้ำ
def octal_to_hex(octal_str):
    try:
        decimal_value = int(octal_str, 8)  # อ่านค่าเป็นฐาน 8
        return hex(decimal_value)[2:].upper()
    except ValueError:
        return "ค่าเลขฐานแปดไม่ถูกต้อง"

# ทดสอบกับค่า permission จริง
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() แปลงตัวเลขนั้นเป็น hex ส่วน [2:] ตัดคำนำหน้า 0x ออกครับ

แปลงเลขฐานแปดเป็น hex ด้วย 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 แสดงผลเป็น hex ตัวพิมพ์ใหญ่
    snprintf(hex_output, sizeof(hex_output), "%lX", decimal_value);

    printf("ฐานแปด %s = Hex %s\n", octal_input, hex_output);
    // ผลลัพธ์: ฐานแปด 755 = Hex 1ED

    // ตัวอย่างแปลงหลายค่าพร้อมกัน
    char *permissions[] = {"755", "644", "777", "600"};
    int count = 4;

    printf("\nตารางแปลงค่า Permission:\n");
    for (int i = 0; i < count; i++) {
        long val = strtol(permissions[i], NULL, 8);
        printf("ฐานแปด %-5s = Hex %lX\n", permissions[i], val);
    }

    return 0;
}

ฟังก์ชัน strtol เหมาะกับงานนี้มากครับ เพราะรองรับการแปลงฐานในตัว และปลอดภัยกว่าการแยกวิเคราะห์ด้วยตัวเอง ส่วน format specifier %lX แสดงผล hex เป็นตัวพิมพ์ใหญ่ครับ

สำหรับการแปลงที่เกี่ยวข้องในโปรเจกต์ของคุณ อาจต้องใช้ การแปลงฐานแปดเป็นฐานสอง หรือ การแปลงฐานสองเป็น hex เป็นขั้นตอนกลางด้วยครับ

ตารางอ้างอิงการแปลงค่าด่วน

นี่คือตารางค่าเลขฐานแปดที่พบบ่อยพร้อมค่าเทียบเท่าในฐานสิบและฐานสิบหกสำหรับใช้อ้างอิงได้เลยครับ:

เลขฐานแปด เลขฐานสิบ เลขฐานสิบหก การใช้งานทั่วไป
777 511 1FF สิทธิ์เต็มทุกระดับ (rwxrwxrwx)
755 493 1ED สิทธิ์มาตรฐานสำหรับไฟล์รันได้
644 420 1A4 สิทธิ์มาตรฐานสำหรับไฟล์ทั่วไป
600 384 180 ไฟล์ส่วนตัว (เจ้าของเท่านั้น)
377 255 FF ค่าสูงสุดของ byte เดียว
10 8 8 จุดทดหลักแรกของเลขฐานแปด

สำหรับผู้ที่อยากเข้าใจลึกขึ้นเกี่ยวกับความสัมพันธ์ระหว่างระบบตัวเลขเหล่านี้ บทความ Wikipedia เรื่องเลขฐานแปด มีข้อมูลอ้างอิงครบถ้วน รวมถึงบริบทเชิงประวัติศาสตร์ว่าทำไมเลขฐานแปดถึงถูกใช้ในฮาร์ดแวร์คอมพิวเตอร์ยุคแรกครับ

สรุป

การแปลงเลขฐานแปดเป็นเลขฐานสิบหกเป็นพื้นฐานที่ดูซับซ้อนตอนแรก แต่พอทำบ่อยๆ ก็จะติดมือเองครับ หัวใจหลักมีเพียงอย่างเดียว คือใช้เลขฐานสองเป็นสะพานเชื่อม แต่ละหลักของเลขฐานแปดแปลงเป็น 3 บิต จากนั้นจัดกลุ่มใหม่เป็น 4 บิต แล้วแต่ละกลุ่มก็กลายเป็นหนึ่งหลัก hex Python ทำได้ในบรรทัดเดียวอย่างสะอาด ส่วน C ให้ความควบคุมที่แม่นยำด้วย strtol ครับ ไม่ว่าจะดีบัก permission, วิเคราะห์ memory, หรือ port โค้ดเก่า ทักษะนี้ช่วยลดความสะดุดในการทำงานและทำให้คุณเป็นนักพัฒนาที่คมและมั่นใจขึ้นอีกระดับครับ

เครื่องมือแปลงเลขฐานแปดเป็น Hex

แปลงเลขฐานแปดเป็น Hex ทันที - เครื่องมือออนไลน์ฟรี

ข้ามขั้นตอนคำนวณเองได้เลยครับ แค่วางค่าเลขฐานแปดแล้วรับผลลัพธ์เป็น hex ทันที ไม่ต้องติดตั้งหรือตั้งค่าใดๆ ทั้งนั้น

ลองใช้เครื่องมือแปลงเลขฐานแปดเป็น Hex ฟรีของเรา →

ระบบและเครื่องมือต่างๆ ใช้ฐานตัวเลขที่แตกต่างกันครับ สิทธิ์ไฟล์ใน Unix เขียนเป็นเลขฐานแปด ในขณะที่ debugger, โปรแกรมวิเคราะห์ memory และ API สมัยใหม่แสดงค่าเป็น hex การแปลงระหว่างสองฐานนี้ทำให้เราใช้ข้อมูลข้ามสภาพแวดล้อมได้อย่างถูกต้องและไม่เกิดความเข้าใจผิดครับ

กรณีที่พบบ่อยที่สุดได้แก่ การอ่านค่า Unix file permission ใน security log, การ port firmware จากไมโครคอนโทรลเลอร์รุ่นเก่าที่ใช้การกำหนด address แบบฐานแปด, การวิเคราะห์ข้อกำหนดโปรโตคอลเครือข่ายรุ่นเก่า และการแปลงค่าช่องสีจากโปรแกรมกราฟิกที่แสดงผลเป็นเลขฐานแปดครับ

เครื่องมือแปลงเลขฐานแปดเป็น hex ฟรี ของเราแปลงค่าได้ทันทีโดยไม่ต้องตั้งค่าใดๆ ครับ เหมาะสำหรับการค้นหาค่าด่วน, ตรวจสอบหลายค่าพร้อมกัน และยืนยันผลการคำนวณด้วยมือหรือผลลัพธ์จากโค้ดครับ

ได้เลยครับ วิธีที่มีประสิทธิภาพที่สุดข้ามฐานสิบไปเลย คือแปลงแต่ละหลักของเลขฐานแปดเป็นกลุ่มเลขฐานสอง 3 บิต นำบิตมาต่อกัน จัดกลุ่มใหม่เป็น 4 บิตจากด้านขวา แล้วแปลงแต่ละกลุ่มเป็น hex วิธีผ่านสะพานเลขฐานสองนี้เร็วกว่าและผิดพลาดน้อยกว่าการผ่านฐานสิบครับ

Python ไม่มีฟังก์ชันเดียวสำหรับงานนี้โดยเฉพาะครับ แต่สามารถใช้ฟังก์ชันในตัวสองตัวรวมกันได้ คือ int(value, 8) สำหรับอ่านสตริงเลขฐานแปด และ hex() สำหรับแสดงผลเป็น hex การแปลงทั้งหมดใช้โค้ดแค่บรรทัดเดียวและรับค่าเลขฐานแปดที่ถูกต้องได้ทุกรูปแบบครับ