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 ::交换,并确保它的优化;之后,我会说你的空间非常理想。我有理由相信这是一次最佳的为好。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top