Link to home
Start Free TrialLog in
Avatar of kccsf
kccsf

asked on

Converting from Little Endian to Big Endian

Hi - I am opening a socket up from a Mandrake machine (Little Endian) to an HP9000 (Big Endian) and receiving a record out of a KISAM file into a variable.

I then write this variable to disk. KISAM files have a data dictionary which states information about where in the record a field is located and the length it is in bytes.

The data dictionary states that the field I am looking for is binary, starts at byte 2 and is 3 bytes long. The field when unpacked should be a long integer 176385.

If I write the variable containing the record I received to disk and open it in binary editor I get this (just showing the first four bytes):
00000000 00000010 10110001 00000001

I wrote a script in perl to pack 176385 and wrote the resulting variable to disk
$num = pack("L", 176385);
Editing this file in binary editor showed:
00000001 10110001 00000010

I presume that I need to convert my variable from big endian to little endian, do a substr($record,2,3)  to get the 3 bytes from start byte 2 (as the data dictionary states) and then unpack the resulting string.

How do I convert my variable from big endian to little endian in perl?

PS Im not being tight - I only have 75 points to offer!
ASKER CERTIFIED SOLUTION
Avatar of ozo
ozo
Flag of United States of America image

Link to home
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Start Free Trial
Avatar of Sapa
Sapa

kccsf:

 or even better, send all binary data in machine independent 'network order'.

$num=pack('N',176385);  # on sender side

and

$u32=unpack('N',$num); # on receiver side

- Sapa
Avatar of kccsf

ASKER

Apologies for delay - just got back rfom holiday and relooked at this.

The answer was to do this but I had to append a blank byte on the front of the substring if it was made up of an odd number of bytes.

Instead I am now looping through the number one byte at a time and bitshifting it depending on which byte it is ie:

1st byte
2nd byte <<8
3rd byte <<16

and totalling them up.

Thanks for your help.