سؤال

هذا ليس سؤال محدد إلى أي لغة برمجة.نقول لديك بعض الملفات المكتوبة على big-endian آلة, وأنت تعرف هذا.إذا اثنين بايت واحد قيم كتبت العودة إلى الوراء ، كيف لك أن تعرف ؟ Big-endian عكس النظام من 16 ، 32 ، 64 بت القيم ، لذلك كيف يمكنك أن تعرف أنك تحتاج إلى قراءة الفردية بايت?

فعلى سبيل المثال ، يمكنك كتابة البايت 0x11 ، ثم بايت 0x22.الملف يحتوي 0x1122.إذا كنت تقرأ هذا على القليل endian آلة عليك تحويله.حتى أن تقرأ على أنها 2211 ، أو 1122?هل تعرف كيف ؟

هل هذا منطقي ؟ أشعر أن أنا في عداد المفقودين شيء سوبر الأساسية هنا.

هل كانت مفيدة؟

المحلول

وليس هناك طريقة لمعرفة. هذا هو السبب في تنسيقات الملفات المحددة رسميا عادة تفرض على endianness، أو أنها توفر خيارا (كما هو الحال مع يونيكود، كما ذكر MSN). بهذه الطريقة، إذا كنت تقرأ ملف مع شكل خاص، وكنت معرفة انها كبيرة-endian بالفعل، لأن حقيقة انه في هذا الشكل ينطوي على endianness معين.

وآخر مثال جيد على ذلك هو أمر شبكة بايت - بروتوكولات الشبكة وعادة ما تكون كبير-endian، لذلك إذا كنت معالج endian طفيف يتحدث إلى شبكة الإنترنت، لديك لكتابة أشياء الوراء. إذا كنت كبير-endian، كنت لا داعي للقلق حول هذا الموضوع. الناس استخدام وظائف مثل htonl و ntohl إلى أشياء المعالجة المسبقة يكتبون ل الشبكة بحيث كود مصدرها هو نفسه على كل الآلات. وتعرف هذه الوظائف لا علاقة له على أجهزة endian كبيرة، لكنها الوجه بايت على أجهزة Endian طفيف.

ووتحقيق الرئيسي هو أن endianness هو خاصية كيف وجه الخصوص <م> أبنية تمثل الكلمات. انها ليست ولاية أن لديهم لكتابة <م> الملفات بطريقة معينة. هو فقط يقول لك أن التعليمات على بنية تتوقع كلمات متعددة البايت أن يكون أمرت بايت بهم بطريقة معينة. آلة كبيرة-endian يمكن أن يكتب نفس تسلسل بايت بوصفها آلة Endian طفيف، هو فقط قد تستخدم بضعة تعليمات للقيام بذلك، لأنه يحتوي على إعادة ترتيب بايت. وينطبق الشيء نفسه على آلات Endian طفيف كتابة صيغ endian كبيرة.

نصائح أخرى

تحتاج إلى إما الإلهي لأنك تعلم شيء آخر (أي ، أعلم يمكنك قراءة ملف في تنسيق endian) أو تحتاج إلى ترميز endianness في الملف بطريقة أو بأخرى.نص Unicode استخدام ملفات 0xFFFE (أو شيئا من هذا القبيل) كما الأولين بايت من ملف نصي إلى حساب endianness.إذا كنت تقرأ على أنها 0xfffe ، ثم إنه في الأم تنسيق endian.إذا كنت تقرأ على أنها 0xfeff, ليس.

وأنت على حق تماما ... دون فكرة عن البيانات التي تبحث في، وليس هناك طريقة لمعرفة.

وأن يقال، وغالبا ما تكون هناك طرق لتخمين ... إذا كنت تعرف أنك من المفترض أن تكون رؤية النص، هل يمكن تشغيل بعض الاختبارات البسيطة لمعرفة ما إذا كنت الحصول على غير معقول ... إذا كنت تستطيع قراءة رأس خارج، يمكنك غالبا الإلهي هو من ذلك ... ولكن إذا كنت تبحث فقط في تيار بايت، وليس هناك طريقة مؤكدة النجاح ل<م> معرفة .

<اقتباس فقرة>   

هل هذا أي معنى؟

ونعم: انها مشكلة

<اقتباس فقرة>   

وأنا أشعر أنني في عداد المفقودين شيء السوبر الأساسي هنا.

والأساس، وقراءة ملف (وخاصة ملف ثنائي) تحتاج إلى معرفته تنسيق الملف: والذي يتضمن معرفة ما إذا كان الزوج من وحدات البايت هو سلسلة من البايتات الفردية، أو هي كلمة مزدوجة البايت واحدة

ولست متأكدا إذا كان هذا هو بالضبط ما كنت طالبا، ولكن، على سبيل المثال، يحدد شكل ملف PCAP على endianness متغير:

http://www.winpcap.org/ntar/draft/PCAP -DumpFileFormat.html

وهذا المفهوم هو أنه يمكنك كتابة "علامة" البايت، مثل 0x12345678، إلى رأس الملف. على جهاز "endian كبيرة" مثل باور، وسوف تكون مكتوبة على النحو التالي:

و0x12 0x34 0x56 0x78

في جهاز "Endian طفيف" مثل x86 و سيكتب على النحو التالي:

و0x78 0x56 0x34 0x12

وبعد ذلك، عند قراءة رأس الخاص بك، هل يمكن أن نقول بما <م> الخاص بك آلة تلا لتحديد ما إذا كنت بحاجة لمبادلة بايت أثناء قراءة الملف. أو هل يمكن تحديد endianness، مثل endian كبيرة. ثم هل مبادلة دائما بايت في على جهاز endian قليلا.

في حالة تنسيق PCAP، وقد تم ذلك لأسباب تتعلق بالأداء. ولكن من المحتمل أن يكون أسهل لتحديد وendianness والتشبث به.

والمعالج يعمل في وضع واحد أو غيرها من endian (بعض يمكن التبديل بناء على الصفحات، الخ). لم يفعلوا ذلك معرفة لو انهم يفعلون الشيء الصحيح أم لا. أنها مجرد فعل ما يفعلونه. (القمامة في القمامة خارج): -)

وليس هناك طريقة للكشف عن أود أن أقول. ولكن في C # لBitConverter لديه-ممتلكاتهم IsLittleEndian.

وكل هذا يتوقف على الطريقة التي تريد أن enterpret ذلك.

هنا .

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top