Contributor: SWAG SUPPORT TEAM


Some time ago I had to write some data marshalling tools, and I had to
perform byte swapping in both Delphi and C++  (we had to talk to a Sun
box). Here is the code that will perform byte swapping on any type (single,
double, extended, etc)

procedure PerformByteSwapping(DataPtr : Pointer;NoBytes : integer);
var
  i : integer;
  dp : PChar;
  tmp : char;
begin
  // Perform a sanity check to make sure that the function was called
properly
  if (NoBytes > 1) then
  begin
    Dec(NoBytes);
    dp := PChar(DataPtr);
    // we are now safe to perform the byte swapping
    for i := NoBytes downto (NoBytes div 2 + 1) do
    begin
      tmp := Pchar(Integer(dp)+i)^;
      Pchar(Integer(dp)+i)^ := Pchar(Integer(dp)+NoBytes-i)^;
      Pchar(Integer(dp)+NoBytes-i)^ := tmp;
    end;
  end;
end;

The way to use this function is as follows::
j : integer;
x : double;
y : extended;

PerformByteSwapping(@i,SizeOf(i)); //to swap an integer
PerformByteSwapping(@x,SizeOf(x)); //to swap a double
PerformByteSwapping(@y,SizeOf(y)); //to swap an extended.
The function works very well, and has been tested thoroughly.

On the C side I could follow a more elegant approach - such as this::
//first define a macro that will enable easy usage ::
#define SwapBytes(x) PerformByteSwapping((char *)&(x),sizeof((x)))

int PerformByteSwapping(char *DataPtr, int NumBytes)
{
  char tmp;
  char *OtherEnd;

  /* Perform a sanity check to make sure that the function was called
properly*/
  if ((NumBytes <= 1) || !DataPtr)
        return(0);
        OtherEnd = &DataPtr[NumBytes-1];
  do
  {
    tmp = *DataPtr;
    *DataPtr++ = *OtherEnd;
    *OtherEnd-- = tmp;
  } while (DataPtr < OtherEnd);
  return(1);
}

//the macro makes things easier ... eg
int i;
double x;
SwapBytes(i); //with macro substitution things are easier to code and
become more readable
SwapBytes(x);

P.S. If anyone  gets this message please acknowledge, as my messages did
not make it to the list lately.
I hope this helps. Cheers.

teo@partnership-group.com.au