แยกไฟล์ไบนารีใน PHP
การใช้ภาษาระดับต่ำในการจัดเก็บค่าที่กำหนดจะต้องใช้รหัสไบนารีเมื่อคุณโหลดในโปรแกรมแก้ไขข้อความเพื่อบันทึกหรืออ่าน
ไม่สามารถอ่านไฟล์ไบนารีได้เนื่องจากอยู่ในรูปแบบไบนารีแบบดิบในภาษาอย่าง Pascal ดังนั้นผู้ดูแลเว็บใช้ PHP เพื่ออ่านและเขียนไฟล์เป็นข้อความ ต้องใช้ฟังก์ชันเฉพาะเพื่อดึงค่าของคุณ
PHP ใช้ฟังก์ชั่นพิเศษที่เรียกว่า unpack () หลังจากมีการประกาศอาร์กิวเมนต์ชนิดข้อมูลแรกคุณจะต้องกู้คืนและสร้างอาร์กิวเมนต์ที่สองเป็นสตริงที่คุณต้องการดึงข้อมูล ข้อมูลที่กู้คืนได้จะต้องอยู่ในข้อโต้แย้งเชิงสัญลักษณ์
เมื่อใช้ภาษาระดับต่ำเช่น C หรือ Pascal เป็นขั้นตอนทั่วไปในการจัดเก็บข้อมูลในไฟล์ไบนารี (ระเบียนที่ไม่สามารถแปลเป็นข้อความ)
ใช้ภาษา C หากคุณต้องการบันทึกค่า 500 ในไฟล์รหัสจะเป็นดังนี้:
#include int main () {int val = 500; ไฟล์ * fp = fopen ("file", "wb"); fwrite (& val, sizeof (int), 1, fp); // store val ใน "file" fclose (fp); กลับ 0 }
เมื่อเปิดไฟล์นี้ด้วยโปรแกรมแก้ไขข้อความคุณอาจพบว่าไฟล์ไม่สามารถอ่านได้เนื่องจากค่าของคุณไม่ได้รับการบันทึกเป็นข้อความ แต่อยู่ในรูปแบบไบนารีดิบ
แต่ถ้าคุณใช้ PHP ก็มักจะจำเป็นต้องดึงค่าที่เก็บไว้เป็นไบนารี่เป็นครั้งคราว อย่างไรก็ตาม PHP อ่านและเขียนไฟล์เป็นข้อความ ต้องใช้ฟังก์ชันเฉพาะเพื่อดึงค่าของคุณ
การแก้ไขปัญหา:
ฟังก์ชัน unpack () สามารถใช้แก้ปัญหาประเภทนี้ได้ คุณต้องประกาศประเภทของข้อมูลที่คุณต้องการกู้คืนจากนั้นสตริงที่คุณต้องการดึงข้อมูล
ประเภทของข้อมูลที่จะกู้คืนต้องมีรายละเอียดโดยใช้สัญลักษณ์ที่สอดคล้องกัน ตัวอย่างเช่นในการเรียกข้อมูลจำนวนเต็มแบบลงนามให้ใช้อักขระ i
ดังนั้นหากเราใช้ไฟล์ที่เราบันทึกไว้ในตัวอย่างด้านบนนี่คือรหัสเพื่อดึงค่าของเรา:
- หมายเหตุสำคัญ:
- ขนาดข้อมูลอาจเปลี่ยนแปลงได้ขึ้นอยู่กับสถาปัตยกรรมโปรเซสเซอร์ (Sparc, ARM, PowerPC)
- โปรแกรมที่เขียนใน C ใช้จำนวนเต็มขนาดแตกต่างกันจาก 32- บิตถึง 64 บิต
- การจัดเรียงข้อมูลอาจไม่เหมือนกัน เครื่องจักรบางเครื่องเก็บข้อมูลใน Big Endian และอื่น ๆ ใน Little Endian
- ขนาดข้อมูลอาจแตกต่างกันไปขึ้นอยู่กับคอมไพเลอร์
- ฟังก์ชั่น unpack ส่งคืนอาร์เรย์ที่ซับซ้อนกว่าที่ได้รับเป็นตัวอย่างที่นี่ ในกรณีของเราด้วยค่าที่ร้องขอหนึ่งค่าของเราจะอยู่ใน offset 1 ของอาร์เรย์
- ชนิดข้อมูลสำหรับพีซีแบบ 32 บิต
- นี่คือตารางแสดงข้อมูลที่บันทึกโดยโปรแกรม C ที่คอมไพล์แล้วสำหรับพีซีแบบ 32 บิต:
- ถ่าน : c
- ถ่านที่ไม่ได้ลงชื่อ : C
- สั้น : s
- สั้นไม่ได้ลงนาม : S
- int : ฉัน
- int ที่ไม่ได้ลงชื่อ : L
- ลอย : f
- สองครั้ง : d