代码之家  ›  专栏  ›  技术社区  ›  xian

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

  •  10
  • xian  · 技术社区  · 16 年前
    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 回复  |  直到 12 年前
        1
  •  26
  •   kmkaplan    12 年前

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

    #include <algorithm>
    void ReverseBytes( void *start, int size )
    {
        char *istart = start, *iend = istart + size;
        std::reverse(istart, iend);
    }
    
        2
  •  18
  •   Michael Manner    12 年前

    不使用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岁半了,但很有可能是其他人也在寻找同样的东西。这就是为什么我仍然张贴这个。

        3
  •  1
  •   Mykola Golubyev    16 年前

    如果需要反转,有可能改进算法并只使用反转迭代器。

        4
  •  1
  •   Rob K    16 年前

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

        5
  •  0
  •   Paul Nathan    16 年前

    我会查看stl::swap并确保它是优化的;之后我会说您是空间的最佳选择。我相当肯定这也是最佳时间。