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


AltStyle によって変換されたページ (->オリジナル) /