هل هناك طريقة أفضل لعكس مجموعة من البايتات في الذاكرة؟

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

  •  06-09-2019
  •  | 
  •  

سؤال

typedef unsigned char Byte;

...

void ReverseBytes( void *start, int size )
{
    Byte *buffer = (Byte *)(start);

    for( int i = 0; i < size / 2; i++ ) {
        std::swap( buffer[i], buffer[size - i - 1] );
    }
}

ما تفعله هذه الطريقة الآن الآن يعكس البايتات في الذاكرة. ما أود أن أعرفه هو، هل هناك طريقة أفضل للحصول على نفس التأثير؟ الجزء الكامل "الحجم / 2" يبدو وكأنه شيء سيء، لكنني لست متأكدا.

تحرير: لقد أدركت فقط مدى سوء العنوان الذي وضعته لهذا السؤال كان، لذلك أنا [نأمل] إصلاحه.

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

المحلول

المكتبة القياسية لديها std::reverse وظيفة:

#include <algorithm>
void ReverseBytes( void *start, int size )
{
    char *istart = start, *iend = istart + size;
    std::reverse(istart, iend);
}

نصائح أخرى

حل أداء دون استخدام STL:

void reverseBytes(void *start, int size) {
    unsigned char *lo = start;
    unsigned char *hi = start + size - 1;
    unsigned char swap;
    while (lo < hi) {
        swap = *lo;
        *lo++ = *hi;
        *hi-- = swap;
    }
}

على الرغم من أن السؤال هو 3 سنوات من العمر، إلا أن الفرص هي أن شخصا آخر سيبحث عن نفس الشيء. لهذا السبب ما زلت نشر هذا.

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

إذا كنت تعكس البيانات الثنائية من ملف مع نخلة مختلفة، فربما يجب عليك استخدام وظائف NTOH * و Hton *، والتي تقوم بتحويل أحجام البيانات المحددة من الشبكة إلى النظام المضيف والعكس بالعكس. يتحول NTOHL على سبيل المثال إلى طوله 32 بت غير موقعة من نبيذ كبير (ترتيب الشبكة) إلى النظام المضيف (نبيذ صغير على آلات X86).

أود مراجعة STL :: SWAP وتأكد من تحسينها؛ بعد ذلك أقول أنك الأمثل للغاية بالنسبة للمساحة. أنا متأكد من ذلك بشكل معقول أن الوقت الأمثل أيضا.

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