[Back to DELPHI SWAG index] [Back to Main SWAG index] [Original]
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
[Back to DELPHI SWAG index] [Back to Main SWAG index] [Original]