views:

447

answers:

4
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] );
    }
}

What this method does right now is it reverses bytes in memory. What I would like to know is, is there a better way to get the same effect? The whole "size / 2" part seems like a bad thing, but I'm not sure.

EDIT: I just realized how bad the title I put for this question was, so I [hopefully] fixed it.

+12  A: 

The STL has a reverse function:

#include <algorithm>
void ReverseBytes( void *start, int size )
{
    char *istart = start, *iend = istart + size;
    std::reverse(istart, iend);
}
kmkaplan
Thanks. I should have looked it up before writing it myself.
kitchen
+1  A: 

If you need to reverse there is a chance that you can improve your algorithms and just use reverse iterators.

Mykola Golubyev
It's for reading data from files that uses different endiannesses.
kitchen
@kitchen, this seems more like reversing the bytes of an integer, not the bytes of a whole array...
Hosam Aly
+1  A: 

If you're reversing binary data from a file with different endianness you should probably use the ntoh* and hton* functions, which convert specified data sizes from network to host order and vice versa. ntohl for instance converts a 32 bit unsigned long from big endian (network order) to host order (little endian on x86 machines).

Rob K
A: 

I would review the stl::swap and make sure it's optimized; after that I'd say you're pretty optimal for space. I'm reasonably sure that's time-optimal as well.

Paul Nathan
Nowhere near time-optimal. The `size/2` calculation *might* be optimized out of being run every loop, but the `size-i-1` calculation wouldn't be, nor would the cost of the array indexing.That said, a perfectly optimized loop wouldn't be *that* much faster than what he's got.
Head Geek
It's the "not *that* much faster" which caused me to say it...
Paul Nathan