ما التحولات التي يتم استخدامها من قبل endian طفيف أنظمة تحويل البيانات إلى شبكة النظام ؟

StackOverflow https://stackoverflow.com/questions/463416

سؤال

ما هي التحولات الأساسية اللازمة لتحويل البيانات في endian طفيف في شبكة بايت النظام ؟ 2 بايت و 4 بايت البيانات المعروفة وظائف (مثل htons, ntohl ، إلخ.) لتغليف التغييرات ما يحدث سلاسل من 1 بايت من البيانات (إذا كان أي شيء)?

أيضا, ويكيبيديا يعني أن endian طفيف هو صورة طبق الأصل من big-endian ، ولكن إذا كان ذلك صحيحا لماذا نحن بحاجة إلى معالجة محددة ل 2 و 4 بايت البيانات ؟

المقال "على الحروب المقدسة و نداء من أجل السلام" يبدو ان هذا يعني أن هناك العديد من النكهات المختلفة من endian طفيف -- انها قديمة مقال -- لا يزال تطبيق ؟ يتم ترتيب البايت علامات مثل تلك التي وجدت في بداية جافا ملفات فئة لا تزال ضرورية ؟

وأخيرا, هو 4 بايت محاذاة اللازمة شبكة بايت النظام ؟

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

المحلول

ودعونا نقول لديك نص ASCII "BigE" في b مجموعة من وحدات البايت.

b[0] == 'B'
b[1] == 'i'
b[2] == 'g'
b[3] == 'E'

وهذا هو ترتيب شبكة لسلسلة كذلك.

إذا تم التعامل معها كعدد صحيح 32 بت، فإنه سيكون

'B' + ('i' << 8) + ('g' << 16) + ('E' << 24) 

وعلى منصة endian قليلا و

'E' + ('g' << 8) + ('i' << 16) + ('B' << 24) 

وعلى منصة endian كبيرة.

إذا قمت بتحويل كل عمل 16 بت على حدة، وكنت الحصول على أيا من هذه

'i' + ('B' << 8) + ('E' << 16) + ('g' << 24) 

وهذا هو السبب ntohl وntohs كلاهما مطلوب.

وبعبارة أخرى، مقايضة ntohs بايت ضمن باختصار 16 بت، وntohl عكس ترتيب بايت أربعة من كلمة 32 بت لها.

نصائح أخرى

وظائف معالجة محددة ل2 و 4 بيانات بايت الاستفادة من حقيقة أن هناك تعليمات المعالج الذي تعمل على أحجام بيانات محددة. تشغيل عكس وظيفة 1 بايت أربع مرات هو بالتأكيد أقل كفاءة من استخدام تعليمات أوسع لتؤدي نفس العمليات (وإن كان زيادة في الحجم) على كل بايت أربعة في آن واحد.

لا يتطلب

1 البيانات بايت أي تحويل بين endians (هو ميزة من UTF-8 على UTF-16 و UTF-32 لترميز سلسلة).

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

وهو محاذاة 4 بايت اللازمة لترتيب شبكة البايت؟

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

والفكرة الأساسية هي أن كل multi-byte أنواع يجب أن يكون ترتيب بايت عكس.أربعة بايت عدد صحيح قد بايت 0 و 3 تبادلت و بايت 1 و 2 تبادلت.اثنين بايت عدد صحيح قد بايت 0 و 1 تبادلت.واحد البايت لا تبديل.

هناك نوعان من مهم جدا الآثار المترتبة على هذا أن غير practicioners و المبتدئين دائما لا تدرك:

  1. (ASCII) سلاسل الأحرف لا يتم لمسها.
  2. هناك لا ممكن أعمى خوارزمية بايت مبادلة عامة "البيانات".عليك أن تعرف نوع من جميع البيانات الخاصة بك وتبادل كل بند بالطريقة المطلوبة نوعه.
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top