14
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”部分似乎是一件坏事,但我不确定。

编辑:我刚刚意识到我给这个问题的标题有多糟糕,所以我[希望]修复了它。

4

5 回答 5

30

标准库有一个std::reverse功能:

#include <algorithm>
void ReverseBytes( void *start, int size )
{
    char *istart = start, *iend = istart + size;
    std::reverse(istart, iend);
}
于 2009-02-25T09:16:25.857 回答
22

不使用 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 ½ 年的问题,但很可能其他人会搜索相同的东西。这就是为什么我仍然发布这个。

于 2012-07-07T14:30:13.847 回答
2

如果您需要逆向,则有机会改进您的算法并仅使用逆向迭代器。

于 2009-02-25T10:56:34.383 回答
1

如果您要从具有不同字节顺序的文件中反转二进制数据,您可能应该使用 ntoh* 和 hton* 函数,它们将指定的数据大小从网络顺序转换为主机顺序,反之亦然。例如,ntohl 将 32 位无符号长从大端(网络顺序)转换为主机顺序(x86 机器上的小端)。

于 2009-02-25T16:35:28.267 回答
0

我会查看 stl::swap 并确保它已优化;在那之后,我会说你非常适合空间。我有理由确定这也是时间最优的。

于 2009-02-25T16:43:05.410 回答