hexdump vs เนื้อหาไฟล์จริง


16

เมื่อฉันhexdump filename.txtฉันได้รับต่อไปนี้เป็นผลลัพธ์:

00000000 ac5a 5afb c08d 5d15 26d0 2491 e8c9 8917
00000010 

เมื่อฉันฉันจะ<?= bin2hex(file_get_contents('filename.txt')); ?>ได้รับสิ่งนี้:

5aacfb5a8dc0155dd0269124c9e81789

ดังนั้นทำไม hexdump จึงแนะนำเนื้อหาควรจะเป็นac5a5afbc08d5d1526d02491e8c98917เมื่อ PHP แนะนำว่าควรจะเป็น5aacfb5a8dc0155dd0269124c9e81789? ฉันไม่ตีความผลลัพธ์ของ hexdump อย่างถูกต้องหรือไม่?


คำตอบ:


24

ความแตกต่างคือbig-เทียบกับการสั่งซื้อน้อย endian

เริ่มต้นด้วยสี่ไบต์แรกของการส่งออก ac5a 5afbhexdump: ตอนนี้สลับลำดับไบต์เพื่อรับ:

5aac fb5a

เปรียบเทียบสิ่งนี้กับผลลัพธ์ PHP:

5aac fb5a

พวกเขาจับคู่

ตามค่าเริ่มต้น BSD hexdumpจะแสดงเอาต์พุตตามค่า endianness ของเครื่อง หากคุณไม่ต้องการสิ่งนั้นคุณสามารถระบุ-Cตัวเลือกเพื่อรับเอาต์พุตไบต์ต่อไบต์แทนคำต่อคำ:

$ hexdump filename.txt 
0000000 ac5a 5afb c08d 5d15 26d0 2491 e8c9 8917
0000010
$ hexdump -C filename.txt 
00000000  5a ac fb 5a 8d c0 15 5d  d0 26 91 24 c9 e8 17 89  |Z..Z...].&.$....|
00000010

4
ในการเพิ่มบิต: hexdump แสดงข้อมูลที่ตีความว่าเป็นคำสิบหกบิต bin2hex แสดงทีละหนึ่งไบค์ตามความเหมาะสมสำหรับอักขระ ASCII หรือที่คล้ายกัน บน x86 และ x64 (และซีพียูตัวน้อยอื่น ๆ ) ไบต์แรกของจำนวนเต็มแบบหลายไบต์มีบิตที่สำคัญน้อยที่สุด ดังนั้นหากสิ่งแรกในไฟล์ของคุณคือจำนวนเต็ม 16 บิตที่มีค่า 1 การแสดงเป็นไบต์จะแสดง 01 00 แต่การแสดงเป็นคำขนาด 16 บิตจะแสดง 0001 (ลำดับการอ่านตามธรรมชาติ LSB ทางด้านขวา อย่างที่เราทำในการใช้ตัวเลขทศนิยมทุกวัน) en.wikipedia.org/wiki/Endianness
Jamie Hanrahan

หากต้องการเพิ่มความคิดเห็นของ @ JamieHanrahan โปรดอ่าน: "และซีพียูน้อยรายอื่น ๆ ทั้งหมด" เนื่องจากนี่เป็นจุดสิ้นสุดของ endianness
glglgl
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.