Есть ли лучший способ обратить массив байтов в памяти? - PullRequest
11 голосов
/ 25 февраля 2009
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] );
    }
}

То, что этот метод делает прямо сейчас, - это обращение байтов в памяти. Я хотел бы знать, есть ли лучший способ получить тот же эффект? Вся часть "size / 2" кажется плохой, но я не уверен.

РЕДАКТИРОВАТЬ: Я только что понял, насколько плохим был заголовок для этого вопроса, поэтому я [надеюсь] исправил его.

Ответы [ 5 ]

26 голосов
/ 25 февраля 2009

Стандартная библиотека имеет функцию std::reverse:

#include <algorithm>
void ReverseBytes( void *start, int size )
{
    char *istart = start, *iend = istart + size;
    std::reverse(istart, iend);
}
18 голосов
/ 07 июля 2012

Эффективное решение без использования 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 с половиной года, есть вероятность, что кто-то другой будет искать то же самое. Вот почему я до сих пор публикую это.

1 голос
/ 25 февраля 2009

Если вы инвертируете двоичные данные из файла с другим порядком байтов, вам, вероятно, следует использовать функции ntoh * и hton *, которые преобразуют указанные размеры данных из сети в порядок хостов и наоборот. Например, ntohl преобразует 32-битную длину без знака из старшего порядкового номера (порядок сети) в порядковый номер узла (младший порядок на машинах с архитектурой x86).

1 голос
/ 25 февраля 2009

Если вам нужно повернуть вспять, есть шанс, что вы можете улучшить свои алгоритмы и просто использовать обратные итераторы.

0 голосов
/ 25 февраля 2009

Я бы пересмотрел stl :: swap и убедился, что он оптимизирован; после этого я бы сказал, что вы довольно оптимальны для космоса. Я уверен, что это оптимально по времени.

...