2009-02-25 5 views
9
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» кажется плохой, но я не уверен.Есть ли лучший способ изменить массив байтов в памяти?

EDIT: Я только понял, насколько плохо заголовок, который я поставил для этого вопроса, был, поэтому я [надеюсь,] исправил его.

+0

Ваш пример кажется ошибочным, как вы можете обменять два символа без места? Я подозреваю, что вам нужно пройти по этому адресу. – leppie

ответ

23

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

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

Спасибо. Я должен был это посмотреть, прежде чем писать сам. – xian

+0

Описание обратной функции гласит, что она реализована точно так, как человек, который задал вопрос, выполнил ее, и что она имеет одинаковую сложность. Это не лучший способ. Более чистый способ, возможно, в лучшем случае. – Julius

1

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

+0

Он предназначен для чтения данных из файлов, которые используют разные континентности. – xian

+0

@ kitchen, это больше похоже на обращение байтов целого числа, а не байтов целого массива ... –

1

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

+0

Этот вопрос касается замены массива, поэтому предлагаемые выше решения специально отвечают, чем нужно. – Xofo

0

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

+0

Нигде рядом с оптимальным временем. Расчет 'size/2' * может * быть оптимизирован из-за запуска каждого цикла, но вычисления' size-i-1' не будут, и не будет стоить индексации массива. Тем не менее, идеально оптимизированный цикл не будет *, что намного быстрее, чем то, что у него есть. –

+0

Это «не *, что * намного быстрее», что заставило меня сказать это ... –

17

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

+5

Шанс понял :) –