有没有更好的方法来反转内存中的字节数组?

时间:2009-02-25 09:10:46

标签: c++ memory swap std

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

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

5 个答案:

答案 0 :(得分:26)

标准库具有std::reverse功能:

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

答案 1 :(得分:18)

不使用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岁半,但其他人可能会搜索同样的事情。这就是为什么我仍然发布这个。

答案 2 :(得分:1)

如果您需要反转,您可以改进算法并使用反向迭代器。

答案 3 :(得分:1)

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

答案 4 :(得分:0)

我会检查stl :: swap并确保它已经过优化;之后我会说你对空间来说非常优秀。我有理由相信这也是时间最优的。