سؤال

ولدي الخاصة غير موقعة الطويلة (32 بت) وأنا في حاجة لتحويل endianness منه شيئا فشيئا - بلدي طويلة يمثل العديد من الأشياء عن smooshed معا في قطعة واحدة من ثنائي

.

وكيف أفعل ذلك؟

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

المحلول

وEndianness هو مفهوم مستوى الكلمة حيث يتم إما تخزين بايت بايت الأكثر كبيرا لأول مرة (endian كبيرة) أو البايت الأقل الكبير الأول (endian قليلا). نقل البيانات عبر شبكة عادة endian كبيرة (ما يسمى شبكة ترتيب بايت). البيانات المخزنة في الذاكرة على جهاز يمكن أن يكون في أي أمر، مع endian القليل كونها الأكثر شيوعا نظرا لانتشار العمارة إنتل x86. على الرغم من أن معظم أبنية الكمبيوتر هي endian كبيرة، وإلى x86 في كل مكان بحيث عليك أكثر كثيرا ما نرى بيانات endian قليلا في الذاكرة.

وعلى أية حال، والهدف من كل ذلك هو أن endianness هو مفهوم محدد جدا أن ينطبق فقط على مستوى البايت، وليس على مستوى بعض الشيء. إذا ntohs()، ntohl()، htons()، وhtonl() لا تفعل ما تريد ثم ما كنت تتعامل مع لا endianness في حد ذاته.

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

نصائح أخرى

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

إذا كنت تريد حقا أن عكس ترتيب كل بت في نوع البيانات 32B، يمكن أن تكتب خوارزمية تكرارية لإخفاء وتحويل كل بت في المناسبة يعكس الموقف.

وظيفة تحويل endianess بسيطة لقيمة طويلة غير موقعة يمكن أن تبدو التالية:

typedef union {
  unsigned long u32;
  unsigned char u8 [ 4 ];
} U32_U8;

unsigned long SwapEndian(unsigned long u)
{
   U32_U8 source;
   U32_U8 dest;

   source.u32 = u;
   dest.u8[0] = source.u8[3];
   dest.u8[1] = source.u8[2];
   dest.u8[2] = source.u8[1];
   dest.u8[3] = source.u8[0];

   return dest.u32;
}

لقلب النظام نوعا من عدد صحيح، يمكنك التحول من البتات في اتجاه واحد وتحويل بت إلى الوجهة في الاتجاه المعاكس.

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