ترتيب بايت مع مجموعة كبيرة من الشخصيات في ج

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

  •  22-08-2019
  •  | 
  •  

سؤال

يا شباب سؤال من أحد ج/شبكات مبتدئ...

أنا أفعل بعض مأخذ البرمجة في C و تحاول أن يتصارع مع ترتيب البايت المشاكل.طلبي (إرسال) على ما يرام ولكن عندما تتلقى البيانات بلدي بايت كل من النظام.أبدأ مع شيء من هذا القبيل...

char * aResponse= (char *)malloc(512);
int total = recv(sock, aResponse, 511, 0);

عند التعامل مع هذا الرد كل 16bit كلمة يبدو أنها بايت عكس (أنا باستخدام UDP).حاولت إصلاح هذا عن طريق القيام بشيء من هذا القبيل...

    unsigned short * _netOrder= (unsigned short *)aResponse;
    unsigned short * newhostOrder= (unsigned short *)malloc(total);
    for (i = 0; i < total; ++i)
    {
         newhostOrder[i] = ntohs(_netOrder[i]);
    }

هذا يعمل على ما يرام عندما أعالج البيانات قصيرة, ومع ذلك إذا لم يلقي المؤشر إلى شار مرة أخرى بايت عكس.ما الخطأ الذي فعلته ؟

وذلك بفضل!

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

المحلول

حسنا, يبدو أن هناك مشاكل مع ما تقوم به على مستويين مختلفين.جزء من الارتباك هنا يبدو أن تنبع من المؤشرات ، ما هو نوع من الأشياء التي يمكن الإشارة إليها ، ثم تفسير ترميز القيم في الذاكرة المشار إليه بواسطة مؤشر(s).

ترميز متعددة البايت الكيانات في الذاكرة هو ما يشار إليه endianess.اثنين المشتركة ترميزات يشار إلى Little Endian (LE) ، Big Endian (أن).مع لو ، 16-بت الكمية مثل قصيرة يتم ترميز البايت الأقل أهمية (LSB) الأولى.تحت يكون أهم بايت (MSB) يتم ترميز الأولى.

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

تحقيق endian قابلية هو الغرض من إجراءات مثل ntohs(), ntohl(), htons(), ، htonl().هذه الوظائف/وحدات الماكرو المعرفة على منصة معينة للقيام التحويلات اللازمة في إرسال واستقبال ينتهي:

  • htons() - تحويل قصيرة قيمة من المضيف بهدف شبكة النظام (إرسال)
  • htonl() - تحويل قيمة طويلة من المضيف بهدف شبكة النظام (إرسال)
  • ntohs() - تحويل قصيرة من قيمة الشبكة من أجل استضافة النظام (بعد استلام)
  • ntohl() - تحويل قيمة طويلة من الشبكة من أجل استضافة النظام (بعد استلام)

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

وأخيرا ، في التحويل حلقة متغير total يشير إلى بايت.ومع ذلك يتم الوصول إلى المخزن المؤقت كما shorts.حلقة الحرس لا ينبغي أن يكون total, ولكن يجب أن تكون:

total / sizeof( unsigned short )

لحساب مزدوجة البايت طبيعة كل short.

نصائح أخرى

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

وهذا يعمل يرام عندما أنا معالجة البيانات كما قصيرة، ولكن إذا ألقيت المؤشر إلى شار يتم عكس مرة أخرى بايت.

وهذا ما كنت أتوقع.

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

وماذا أفعل الخطأ؟

وعليك أن تعرف ما بعث المرسل: معرفة ما إذا كانت البيانات بايت (والتي لا تحتاج عكس)، أو السراويل أو صفقات الشراء (التي لا)

.

وGoogle للدروس المرتبطة ntohs، htons، واجهات برمجة التطبيقات htons.

وليس من الواضح ما aResponse يمثل (سلسلة من الأحرف؟ بنية؟). Endianness هي ذات الصلة فقط من أجل القيم العددية، وليس chars. تحتاج أيضا إلى التأكد من أن في الجانب المرسل، يتم تحويل كافة القيم العددية من مضيف إلى شبكة البايت النظام (hton*).

وبصرف النظر عن السؤال الأصلي الخاص بك (الذي أعتقد أن أجبت)، يجب أن يكون لديك نظرة على الخاص <م> malloc بيان. malloc تخصص بايت وغير موقعة قصيرة من المرجح أن تكون وحدتي بايت.

وبيان يجب أن تبدو:

unsigned short *ptr = (unsigned short*) malloc(total * sizeof(unsigned short));

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

لبايت واحد ونحن قد لا يهتمون ترتيب بايت.

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