decoding ekofisk passive data files - stanford universitysep · decoding ekofisk passive data files...

26
Decoding Ekofisk passive data files A few months ago ConocoPhillips agreed to provide SEP with some passive recordings made over the Ekofisk field. They offered to send those data on 3592 tape cartridges, but we requested they transcribe it to USB disk drives instead. Sjoerd copied a few of the drives to /scratch so I could look at them and figure out how to decode them. ConocoPhillips dug out and sent us a description of the data format that the contractor, OptoPlan, had provided to them. That document states that the format conforms to the Society of Exploration Geophysicists SEG-D Rev 1 standard. To get a copy of that standard, I went to the www.seg.org website and clicked the “Publications” link in the RESOURCES column near the bottom of the page. From there I clicked on the “Technical Standards” link next to the Other Offerings area near the bottom. About halfway down the Technical Standard page are Microsoft Word and Adobe PDF links to that 1994 standards document, originally published in an issue of Geophysics. (Googling the search phrase “segd rev1 site:seg.org” also finds that PDF document.) To compare the file to that format description, I needed to dump out an initial portion of one of those files in a printable form. To do this, I used the two Unix commands “dd” and “xxd” piped together: dd if=/scratch/Ekofisk_Passive/EKOFISK-4D__TAPE03 bs=1024 count=20 | xxd –a > tmp.txt The command line parameters for dd are if= is the name of the input file bs= is the block size for reading (and writing) count= is the number of blocks to read The command line parameter for xxd is -a put an asterisk in place of repeated lines This results in the printout at the end of this report, except I’ve double spaced it for easier reading and annotation.

Upload: lamtu

Post on 26-Apr-2018

226 views

Category:

Documents


2 download

TRANSCRIPT

Decoding Ekofisk passive data files

A few months ago ConocoPhillips agreed to provide SEP with some passive recordings made over the

Ekofisk field. They offered to send those data on 3592 tape cartridges, but we requested they

transcribe it to USB disk drives instead. Sjoerd copied a few of the drives to /scratch so I could look at

them and figure out how to decode them. ConocoPhillips dug out and sent us a description of the data

format that the contractor, OptoPlan, had provided to them. That document states that the format

conforms to the Society of Exploration Geophysicists SEG-D Rev 1 standard.

To get a copy of that standard, I went to the www.seg.org website and clicked the “Publications” link

in the RESOURCES column near the bottom of the page. From there I clicked on the “Technical

Standards” link next to the Other Offerings area near the bottom. About halfway down the Technical

Standard page are Microsoft Word and Adobe PDF links to that 1994 standards document, originally

published in an issue of Geophysics. (Googling the search phrase “segd rev1 site:seg.org” also finds

that PDF document.)

To compare the file to that format description, I needed to dump out an initial portion of one of those

files in a printable form. To do this, I used the two Unix commands “dd” and “xxd” piped together:

dd if=/scratch/Ekofisk_Passive/EKOFISK-4D__TAPE03 bs=1024 count=20 | xxd –a > tmp.txt

The command line parameters for dd are

if= is the name of the input file

bs= is the block size for reading (and writing)

count= is the number of blocks to read

The command line parameter for xxd is

-a put an asterisk in place of repeated lines

This results in the printout at the end of this report, except I’ve double spaced it for easier reading and

annotation.

Let’s take a first look at that printout:

0000000: 3901 8058 1234 5678 9000 1112 9708 2020 9..X.4Vx......

0000010: 4700 0000 0000 2010 009f ff01 9600 01ff G..... .........

0000020: 0000 0000 0000 0001 0000 0100 0000 0027 ...............'

0000030: 1000 0200 0000 0000 0000 0000 0000 0000 ................

0000040: 0101 0000 1388 0000 0054 1000 0223 0293 .........T...#..

0000050: 0000 0000 0000 0000 0000 0000 0300 0101 ................

0000060: 0102 0000 1388 0000 0091 1000 0223 0293 .............#..

0000070: 0000 0000 0000 0000 0000 0000 0300 0201 ................

The first column is the offset of each data line into the file. It

is not a decimal (base 10) number, but a hexadecimal (base 16) number

instead.

The next 8 columns are the hexadecimal representation of each group

of 16 consecutive bytes in the file. In this base 16 notation, a=10,

b=11, c=12, d=13, e=14, and f=15. (Capital letters may also be used.)

Every pair of characters is one byte. The final column is a

representation of those same 16 consecutive bytes as printed

characters. Unprintable characters are replaced by periods.

OK. We now know how to read this xxd output. Now we get to interpret

it. Here is where we turn to the OptoPlan SEG-D format description.

But first we need to define one term and talk about endianness.

Packed Binary Coded Decimal(BCD) is a system in which consecutive

decimal digits are encoded into successive groups of 4 bits,

known as nibbles, in consecutive 8 bit bytes. In the printout,

the first two bytes are the BCD value 3901. The next two are

8058.

Big endian order is when bytes (binary digits) of a number appear

in memory from most significant to least significant. When we

print out numbers on paper, we are writing them in big endian

order. All fields in the SEG-D standard are required to be in

big endian order.

Turning now to the OptoPlan SEG-D Field File Recording Format

document, page 2 says “The format follows the general digital field

tape format standard SEG-D Rev1.” We will refer to the SEG-D

Revision 1 standard document as needed to resolve questions and

ambiguities that may arise.

According to the OptoPlan (and SEG-D standard), the first 32 bytes,

that is, the first two lines of our xxd output, are General Header

Block #1. The SEG-D standard says on page 8 that all fields in this

block are encoded in BCD unless otherwise stated. Following the

OptoPlan description, this header is parsed as:

3901 / 8058 / 123456789000 / 11 / 1 / 297 / 08 / 20 / 20 /

47 / 0000 / 000000 / 20 / 1 / 000 / 9 / fff / 01 / 96 / 00 / 01 / ff

leading to the following decoding:

Value Description Notes

3901 File number

In the event the file number is

greater than 9999, this field is set

to ffff and the file number appears

in General Header Block #2.

8058 Format code 8058 is IEEE 32 bit floating point

123456789000 General constants Unused by OptoPlan

11 Last two digits of

year Year 2011

1

No. additional

blocks in General

Header

Each is 32 bytes

297 Julian day (1-366)

Day of year counting from Jan 1.

Julian day 297 is October 24 in non-

leap years.

8 Hour of day (0-23)

20 Minute of hour

(0-59)

20 Second of minute

(0-59)

Actually could be 60 for rare leap

seconds

47 Manufacturer’s

code

47 is assigned by the SEG to

OptoPlan

0 Manufacturer’s

serial no.

0 Bytes per scan Not applicable for these data

32 (2016) Base scan interval

Binary value in multiples of 1/16th

of a millisecond. Here the base

scan interval is 2 msec.

1 Polarity code Untested by OptoPlan (Should be 0 if

untested. 1 is zero phase.)

0 Scans/block Not applicable for these data

9 Record type 9 = normal, 2 = test

fff Record length fff means value is in GH Block #2

1 Scan type/record 1 = all traces same length and

sample rate

96 No. channel sets

per scan type

A channel set is a grouping of

traces having some common feature.

Here the feature is originating from

the same cable and component of the

4-C receivers.

0 No. sample skew

blocks Not applicable for these data

1

Extended header

length (32 byte

blocks)

Here there is just one extended

header

ff

External header

length (32 byte

blocks)

ff means value is in GH Block #2

As the first general header block indicates, there is exactly one

additional 32-byte general header block, General Header Block #2.

Following the OptoPlan document, these bytes parse out as

000000 / 0000 / 0000 / 0100 / 00 / 0100 / 0000 / 002710 /

00 / 02 / 00000000000000000000000000

and lead to the decoding:

Value Description Notes

0 Extended file number Used for file numbers greater

than 9999.

0 Extended channel sets/scan

type Used if larger than 99

0 Extended header blocks Used if larger than 99

256 External header blocks Used if larger than 99

0 Not used Undefined in SEG-D standard

1.0 SEG-D Revision Number Major version and minor

update numbers

0 Number of blocks of

General Trailer

10000

(271016) Extended record length milliseconds

0 Not used Undefined in SEG-D standard

2 General Header Block

Number

0 Not used Undefined in SEG-D standard

At this point, I feel it is important to point out that the OptoPlan

SEG-D description of these first two General Header Blocks has

eight(!) mistakes and two typographic errors in their description of

their use of the SEG-D Revision 1 standard. Fortunately, the actual

values recorded in those 64 bytes do, with one unimportant exception,

match the SEG-D standard and it is just the OptoPlan text that is

erroneous. Less fortunate, OptoPlan does violate the SEG-D standard

in the next set of headers, the Scan Type Headers that provide

channel set information.

As noted earlier, a channel set is a group of channels with the same

set of parameters. These are each 32 bytes long and numbered

consecutively starting at 1. Referring again to the OptoPlan SEG-D

description, the first channel set parses out as:

01 / 01 / 0000 / 1388 / 0000 / 0054 / 1 / 0 / 0 / 0 / 0223 / 0293 /

0000 / 0000 / 0000 / 0000 / 0000 / 0000 / 0 / 3 / 00 / 01 / 01

and leads to the following decoding:

Value Description Notes

1 Scan type number

1 Channel set number FF for numbers greater than 99

0 Channel set start

time/2 Multiples of 2 msec

5000

(138816)

Channel set end

time/2 Multiples of 2 msec

0 Descale multiplier

No conversion factor needed to

convert trace data to millivolts in

this case

54 No. channels in this

channel set

1 Channel type code 1 = Seis, 9 = Aux

0 Not used Required to be 0 in SEG-D standard

0 No. subscans exponent 20 = 1 means these traces have the

base sample rate from GH 1 (2 msec)

0 Channel gain control

method Not used (trace data needs no gain)

223 Alias filter

frequency In Hz

293 Alias filter slope In dB/octave

0 Low cut filter

frequency In Hz

0 Low cut filter slope In dB/octave. 0 means no low cut

0 Notch frequency 1 In Hz, 0 means no notch

0 Notch frequency 2 In Hz, 0 means no notch

0 Notch frequency 3 In Hz, 0 means no notch

0 Extended channel set

number

0 Extended header flag Set to 1 if extended header has

additional channel set information

3 No. trace header

extensions

Undefined in SEG-D Revision 1, this

was taken from Revision 2.

0 Vertical stack Should be 1 indicating no stack.

1 Cable/streamer no. Receiver point line for OptoPlan

1 Array forming 1=no array forming, n=#groups summed

This pattern repeats for 96 channel sets, with the last channel set

decoding as:

Value Description Notes

1 Scan type number

96 Channel set number FF for numbers greater than 99

0 Channel set start

time/2 Multiple of 2 msec

5000

(138816)

Channel set end

time/2 Multiple of 2 msec

0 Descale multiplier

No conversion factor needed to

convert trace data to millivolts in

this case

36 No. channels in this

channel set

1 Channel type code 1 = Seis, 9 = Aux

0 Not used Required to be 0 in SEG-D standard

0 No. subscans exponent 20 = 1 means these traces have the

base sample rate from GH 1 (2 msec)

0 Channel gain control

method Not used (trace data needs no gain)

223 Alias filter

frequency In Hz

293 Alias filter slope In dB/octave

0 Low cut filter

frequency In Hz

0 Low cut filter slope In dB/octave. 0 means no low cut

0 Notch frequency 1 In Hz, 0 means no notch

0 Notch frequency 2 In Hz, 0 means no notch

0 Notch frequency 3 In Hz, 0 means no notch

0 Extended channel set

number

0 Extended header flag Set to 1 if extended header has

additional channel set information

3 No. trace header

extensions

Undefined in SEG-D Revision 1, this

was taken from Revision 2.

0 Vertical stack Should be 1 indicating no stack.

36

(2416) Cable/streamer no. Receiver point line for OptoPlan

1 Array forming 1=no array forming, n=#groups summed

Houston, we have a problem. The OptoPlan document says that the

channel sets are in groups of 4, one for each of the X, Y, Z, and P

components, so there should be 24 such groups to match the 96 total

channel sets. Indeed, OptoPlan made a mistake and coded the

Cable/streamer number as BCD instead of the binary format prescribed

in the SEG-D standard. This is one of two outright violations of the

SEG-D standard for Revision 1 channel set descriptors. (All told

there are seven errors and typos in the OptoPlan documentation for

their channel sets.)

Moving on, OptoPlan provides one extended header that is zero-filled

for passive recording and, in this case, 256 external headers

containing some navigation header followed by binary zeros. Here is

where the printed last column of the xxd output provides an important

clue with the word HYDRONAV appearing on the line with offset 0000c70

into the file. An internet search reveals that it is the name of a

company that specializes in surveying services and equipment. A

follow on search for “HYDRONAV @@@UHEAD rev6” brings up a PDF

document with details of this format.

0000c60: 0701 00c0 0101 0000 0000 0000 0000 00ff ................

0000c70: 4859 4452 4f4e 4156 0106 00b0 0100 00ff HYDRONAV........

0000c80: 4040 4055 4845 4144 3038 3a32 303a 3230 @@@UHEAD08:20:20

0000c90: 3a30 3030 3030 302c 312c 202a 554e 4445 :000000,1, *UNDE

0000ca0: 462a 2c20 2020 3538 3030 2c31 3239 3720 F*, 5800,1297

0000cb0: 3030 3030 302c 2036 3236 3537 3434 2e30 00000, 6265744.0

0000cc0: 304e 2c20 2035 3130 3435 362e 3030 452c 0N, 510456.00E,

0000cd0: 2020 352e 3030 4b54 2c31 3830 2e30 3044 5.00KT,180.00D

0000ce0: 472c 2020 302e 304d 2c32 342f 3130 2f32 G, 0.0M,24/10/2

0000cf0: 3031 312c 2020 2020 304d 2c20 2020 2020 011, 0M,

0000d00: 2020 304d 2c32 2c20 2030 2e30 4d2c 7061 0M,2, 0.0M,pa

0000d10: 7373 6976 655f 3131 3130 3234 5f31 2aff ssive_111024_1*.

Parsing the external header yields

Value Description Notes

7 Version Number User header 7

1 Revision Number

192 (c016) Length of user header

1 Number of tag blocks

1 Quality of header 1 = good header

0 9 Null bytes Zero filled

ff End of header mark Always ff

HYDRONAV Tag description

8 byte ascii field, blank

padded on right if

necessary

1 Tag description version

6 Tag data revision

176 (b016) Length of tag block Includes following data

1 Date format code 0 = MM/DD/YYYY

1 = DD/MM/YYYY

0 2 Null bytes Zero filled

ff End of tag header mark Always ff

@@@UHEAD HydroNav header 8 byte ascii

08:20:20:000000 Time in HH:MM:SS:SSSSSS 15 byte ascii, microsec

accuracy

, Field separator For ease of reading

1 GPS clock flag 1 = GPS clock used

, Field separator

*UNDEF Vessel name 8 byte ascii

, Field separator

5800 Station number 7 byte ascii

, Field separator

1 Year mod 10 2011 mod 10 = 1

297 Day of year Oct 24 in non-leap year

0 Pop/shot counter

, Field separator

6265744.00N Northing 12 byte ascii

, Field separator

510456.00E Easting 12 byte ascii

, Field separator

5.00KT Vessel speed 8 byte ascii (Dummy)

, Field separator

180.00DG Bearing 8 byte ascii (Dummy)

, Field separator

0.0M Water depth 6 byte ascii (Dummy)

, Field separator

24/10/2011 Date October 24, 2011

, Field separator

0M Distance offline 6 byte ascii (Dummy)

, Field separator

0M Distance inline 9 byte ascii (Dummy)

, Field separator

2 Line status

0 = Offline

1 = Approach

2 = On line (Dummy)

3 = Run out

, Field separator

0.0M GPS height 6 byte ascii (Dummy)

, Field separator

passive_111024_1

Line Name 16 byte ascii

* End of HydroNav data Always asterisk

ff End of tag mark Always ff

For our purposes, none of these external header data are useful,

being either dummy values or duplicates of information that appears

elsewhere in the OptoPlan SEG-D file.

So, at long last, we have reached the actual trace data. Our xxd

dump stops part way into the first trace. Each trace begins with a

trace header consisting, for these data, of 116 bytes, a 20 byte

basic header plus three 32 byte trace header extensions:

0002c60: 3901 0101 0001 0000 0003 0000 0000 0000 9...............

0002c70: 0000 0000 0000 0100 0001 0000 1388 0000 ................

0002c80: 0000 0000 0000 0000 071a 1100 0502 1503 ................

0002c90: e900 0036 48f9 3f2c 4abf 371e 3fbe b852 ...6H.?,J.7.?..R

0002ca0: 0000 0000 0000 0000 0000 0000 4233 70a4 ............B3p.

0002cb0: 0000 0000 0000 0000 0000 0000 0000 0000 ................

0002cc0: 0084 2100 0000 0000 0000 0000 0000 0000 ..!.............

0002cd0: 0000 0000 3f4d 6438 3f4c 8105 3f4c af0f ....?Md8?L..?L..

Returning to the OptoPlan SEG-D document, the initial 20 byte

Demultiplexed Trace Header parses out as:

3901 / 01 / 01 / 0001 / 000000 / 03 / 00 / 00 / 000000 / 0000 / 000000

and decodes to

Value Description Notes

3901 File number FFFF for numbers greater than 9999

1 Scan type number Always 1 for these data

1 Channel set number FF for numbers greater than 99

Ranges from 1 to 96 for these data

1 Trace number Ranges from 1 to 3966 for these data

0 Timing word Not applicable for these data

3 Trace header extensions Must match channel set value

0 Sample skew Not used

0 Time break window 0 for marine operations

0 Extended channel set

number

Used when channel set above is set

to FF

0 Extended file number Used when file number above is set

to FFF

The first trace header extension parses as:

000001 / 000001 / 00 / 001388 / 0000000000 / 0000000000 / 07 / 1a /

11 / 00 / 05 / 02 / 15 / 03e9 / 000036

and decodes to

Value Description Notes

1 Receiver line no. “Cable”

1 Receiver point no. Position on “Cable”

0 Receiver point index Not used

5000

(138816)

Number of samples per

trace

0 Extended receiver line

no. Not used (SEG-D Rev 2)

0 Extended receiver point

no. Not used (SEG-D Rev 2)

7 Sensor type

1 = Hydrophone (pressure sensor)

6 = Accelerometer, Vertical

7 = Accelerometer, Horizontal,

inline (SEG-D Rev 2)

8 = Accelerometer, Horizontal,

cross-line

26 (1a16) Subrack address Internal channel address

17 (1116) Board address Internal channel address

0 Board channel Internal channel address

5 Booster amplifier

2 Splitter output

21 (1516) ITU channel

1001(3e916) Optical Cable

Coded according to quadrant

(ref. Map):

SW – 0-999

NW – 1000-1999

NE – 2000-2999

SE – 3000-3999

54 (3616) Position on Optical

Cable Ref. Map

The second trace header extension parses as:

48f93f2c / 4abf371e / 3fbeb852 / 00000000 / 00000000 / 00000000 /

423370a4 / 00000000

and decodes each of these big-endian 32-bit IEEE floats (using the

website www.h-schmidt.net/FloatConverter/IEEE754.html) to:

Value Description Notes

510457.38 Receiver point easting meters here

6265743.0 Receiver point northing

1.49 Receiver point depth Burial depth in this case

0.0 Receiver rotation XY Degrees

0.0 Receiver rotation ZY Degrees

0.0 Receiver rotation ZX Degrees

44.86 Sensitivity of sensors Hydrophone: dB [rad/Pa]

Accelerometers: dB [rad/g]

0.0 Not used

The third trace header extension parses as:

0000 / 0000 / 0000 / 0000 / 0000 / 00 / 00 / 00842100 /

00000000000000000000000000000000

and decodes to:

Value Description Notes

0 Phase offset error

start sample counter

0 Phase offset error end

sample counter

0 Phase offset error

0 Max. slew rate sample

counter

0 Max. second derivative

sample counter

0084210016 QC-word from all

records, ORed

Internal. This particular entry

says the fringe frequency was

tested on all 4 component

sensors

0 Not used

Following this last trace header extension are the 5000 IEEE 32-bit

floating point samples in this trace, parsed as:

3f4d6438 / 3f4c8105 / 3f4caf0f / 3f4d4f1a / 3f4f2e21 / 3f4de19b /

3f4d08e2 / 3f4dfb8c / …

and decoding to:

0.80231047 / 0.7988437 / 0.7995462 / 0.80198824 / 0.8092976 / 0.8042237 /

0.8009168 / 0.80461955 / …

Teaching a computer to handle the format is more tedious than anything

else, but there are some useful guidelines and tips that make life

easier. There are also some gotchas to be aware of.

The first order of business is to assemble the input bytes into

meaningful numbers. While it is easiest to do this in C or C++, I’ll use

Fortran for my examples. Throughout the following, I assume the

underlying integer values are internally represented in two’s-complement

format, a virtually universal format. The most direct approach is to

read bytes one at a time:

INTEGER FUNCTION GET_UNSIGNED_CHAR(UNIT, READSTAT)

IMPLICIT NONE

INTEGER UNIT, READSTAT

CHARACTER C

READ (UNIT,’A1’,ERR=99,END=99,IOSTAT=READSTAT)C

GET_UNSIGNED_CHAR = ICHAR(C)

IF(GET_UNSIGNED_CHAR .LT. 0) GET_UNSIGNED_CHAR =

& GET_UNSIGNED_CHAR + 256

RETURN

99 CONTINUE

GET_UNSIGNED_CHAR = -1

RETURN

END

This routine returns an integer between 0 and 255 for a successful read

and -1 in event of an I/O error.

To assemble a two-byte integer, we have two routines:

INTEGER FUNCTION GET_UNSIGNED_SHORT(UNIT,READSTAT)

IMPLICIT NONE

INTEGER UNIT, READSTAT

INTEGER IC(2)

INTEGER GET_UNSIGNED_CHAR

EXTERNAL GET_UNSIGNED_CHAR

GET_UNSIGNED_SHORT = -1

IC(1) = GET_UNSIGNED_CHAR(UNIT,READSTAT)

IF (IC(1) .LT. 0) RETURN

IC(2) = GET_UNSIGNED_CHAR(UNIT,READSTAT)

IF (IC(2) .LT. 0) RETURN

GET_UNSIGNED_SHORT = IC(1)*256+IC(2)

RETURN

END

and

INTEGER FUNCTION GET_SIGNED_SHORT(UNIT,READSTAT)

IMPLICIT NONE

INTEGER UNIT, READSTAT

INTEGER IC

INTEGER GET_UNSIGNED_SHORT

EXTERNAL GET_UNSIGNED_SHORT

IC = GET_UNSIGNED_SHORT(UNIT,READSTAT)

GET_SIGNED_SHORT = MOD(IC + 32768,65536) - 32768

RETURN

END

Note that a -1 return value is legitimate for signed quantities; hence

the inclusion of a separate read status argument.

To assemble a 3 byte integer we similarly have

INTEGER FUNCTION GET_UNSIGNED_INTEGER3(UNIT,READSTAT)

IMPLICIT NONE

INTEGER UNIT, READSTAT

INTEGER IC(2)

INTEGER GET_UNSIGNED_CHAR, GET_UNSIGNED_SHORT

EXTERNAL GET_UNSIGNED_CHAR, GET_UNSIGNED_SHORT

GET_UNSIGNED_INTEGER3 = -1

IC(1) = GET_UNSIGNED_CHAR(UNIT,READSTAT)

IF (IC(1) .LT. 0) RETURN

IC(2) = GET_UNSIGNED_SHORT(UNIT,READSTAT)

IF (IC(2) .LT. 0) RETURN

GET_UNSIGNED_INTEGER3 = IC(1)*65536+IC(2)

RETURN

END

and

INTEGER FUNCTION GET_SIGNED_INTEGER3(UNIT,READSTAT)

IMPLICIT NONE

INTEGER UNIT, READSTAT

INTEGER IC

INTEGER GET_UNSIGNED_INTEGER3

EXTERNAL GET_UNSIGNED_INTEGER3

IC = GET_UNSIGNED_INTEGER3(UNIT,READSTAT)

GET_SIGNED_SHORT = MOD(IC + 8388608, 16777216) - 8388608 RETURN

END

Four byte integers bring in a complication because Fortran doesn’t have

any truly unsigned data types. So we need to return an eight byte

integer to hold an unsigned value:

INTEGER*8 FUNCTION GET_UNSIGNED_INTEGER(UNIT,READSTAT)

IMPLICIT NONE

INTEGER UNIT, READSTAT

INTEGER*8 IC(2)

INTEGER GET_UNSIGNED_SHORT

EXTERNAL GET_UNSIGNED_SHORT

GET_UNSIGNED_INTEGER = -1

IC(1) = GET_UNSIGNED_SHORT(UNIT,READSTAT)

IF (IC(1) .LT. 0) RETURN

IC(2) = GET_UNSIGNED_SHORT(UNIT,READSTAT)

IF (IC(2) .LT. 0) RETURN

GET_UNSIGNED_INTEGER = IC(1)*65536+IC(2)

RETURN

END

and

INTEGER*8 FUNCTION GET_SIGNED_INTEGER(UNIT,READSTAT)

IMPLICIT NONE

INTEGER UNIT, READSTAT

INTEGER*8 IC

INTEGER*8 GET_UNSIGNED_INTEGER

EXTERNAL GET_UNSIGNED_INTEGER

IC = GET_UNSIGNED_INTEGER(UNIT,READSTAT)

GET_SIGNED_SHORT = MOD(IC+2147483648,4294967296)-2147483648 RETURN

END

The SEG-D standard also has a few five byte fixed point fields:

INTEGER*8 FUNCTION GET_UNSIGNED_INTEGER5(UNIT,READSTAT)

IMPLICIT NONE

INTEGER UNIT, READSTAT

INTEGER*8 IC(2)

INTEGER GET_UNSIGNED_SHORT,GET_UNSIGNED_INTEGER3

EXTERNAL GET_UNSIGNED_SHORT,GET_UNSIGNED_INTEGER3

GET_UNSIGNED_INTEGER5 = -1

IC(1) = GET_UNSIGNED_INTEGER3(UNIT,READSTAT)

IF (IC(1) .LT. 0) RETURN

IC(2) = GET_UNSIGNED_SHORT(UNIT,READSTAT)

IF (IC(2) .LT. 0) RETURN

GET_UNSIGNED_INTEGER = IC(1)*65536+IC(2)

RETURN

END

and

INTEGER*8 FUNCTION GET_SIGNED_INTEGER5(UNIT,READSTAT)

IMPLICIT NONE

INTEGER UNIT, READSTAT

INTEGER*8 IC(2)

INTEGER GET_UNSIGNED_SHORT,GET_SIGNED_INTEGER3

EXTERNAL GET_UNSIGNED_SHORT,GET_SIGNED_INTEGER3

GET_UNSIGNED_INTEGER5 = -1

IC(1) = GET_SIGNED_INTEGER3(UNIT,READSTAT)

IF (IC(1) .LT. 0) RETURN

IC(2) = GET_UNSIGNED_SHORT(UNIT,READSTAT)

IF (IC(2) .LT. 0) RETURN

GET_UNSIGNED_INTEGER5 = IC(1)*65536+IC(2)

RETURN

END

To retrieve IEEE floating point values, at least on modern IEEE-based

machines, we pull in the bytes as an integer and use an equivalence

statement to read it out as a floating point number:

REAL FUNCTION GET_IEEE32(UNIT,READSTAT)

IMPLICIT NONE

INTEGER UNIT, READSTAT

INTEGER IC

REAL RC

EQUIVALENCE (IC,RC)

INTEGER*8 GET_SIGNED_INTEGER

EXTERNAL GET_SIGNED_INTEGER

IC = INT(GET_SIGNED_INTEGER(UNIT,READSTAT))

GET_IEEE32 = RC

RETURN

END

and

DOUBLE PRECISION FUNCTION GET_IEEE64(UNIT,READSTAT)

IMPLICIT NONE

INTEGER UNIT, READSTAT

INTEGER*8 IC

DOUBLE PRECISION RC

EQUIVALENCE (IC,RC)

INTEGER*8 GET_SIGNED_INTEGER

EXTERNAL GET_SIGNED_INTEGER

IC = GET_SIGNED_INTEGER(UNIT,READSTAT)*4294967296

IC = IC + GET_SIGNED_INTEGER(UNIT,READSTAT)

GET_IEEE64 = RC

RETURN

END

In the above Fortran routines, you may be tempted to optimize a bit,

doing things like replacing multiplication by powers of 2 with a left

shift operation, inlining one routine within another, using alternate

return statements, etc. Generally speaking, don’t bother as optimizing

compilers do an extremely good job of optimizing for you.

To decode binary coded decimal (BCD) values, first read the byte or bytes

into a character array and then call the following function:

C

C DECODE A DECIMAL VALUE ENCODED IN PACKED BINARY FROM A CHARACTER

C ARRAY. NIBBLES 1 AND 2 ARE IN THE FIRST CHARACTER, 3 AND 4 IN THE

C NEXT CHARACTER AND SO FORTH. RETURNS -1 IF THE FIELD IS NOT A

C DECIMAL NUMBER. LOOKUP TABLES USED FOR SPEED

C

INTEGER*8 GET_BCD_VALUE(NUMCHAR,INCHARS,FIRSTNIBBLE,NUMNIBBLE)

IMPLICIT NONE

INTEGER NUMCHAR

CHARACTER*1 INCHARS(NUMCHAR)

INTEGER FIRSTNIBBLE, NUMNIBBLE

INTEGER*8 IC

INTEGER IBYTE, INIBBLE, NIBSTART, NIBEND, NIBVAL

INTEGER FIRSTBYTE, CURBYTE, CURNIBBLE, LASTBYTE, LASTNIBBLE

INTEGER I,J

INTEGER ODDNIB(256),EVENNIB(256),BOTHNIB(256)

LOGICAL UNINITIALIZED

DATA UNINITIALIZED/.TRUE./

SAVE ODDNIB, EVENNIB, BOTHNIB, INITIALIZED

C INITIALIZE FAST LOOKUP TABLES

IF(UNINITIALIZED) THEN

DO I=1,256

ODDNIB(I) = -1

EVENNIB(I) = -1

BOTHNIB(I) = -1

ENDDO

DO I=1,10

DO J=1,10

ODDNIB((I-1)*16+J) = I-1

EVENNIB((I-1)*16+J) = J-1

BOTHNIB((I-1)*16)+J) = (I-1)*10 + J-1

ENDDO

ENDDO

UNINITIALIZED = .FALSE.

ENDIF

GET_BCD_VALUE = -1

C CHECK FOR ERRORS

IF(NUMCHAR .LE. 0 .OR. NUMNIBBLE .LE. 0) RETURN

FIRSTBYTE = 1 + (FISTNIBBLE-1)/2

IF(FIRSTBYTE .GT. NUMCHAR .OR. FIRSTBYTE .LT. 1) RETURN

LASTNIBBLE = FIRSTNIBBLE + NUMNIBBLE – 1

LASTBYTE = 1 + (LASTNIBBLE-1)/2

IF(LASTBYTE .GT. NUMCHAR .OR. LASTBYTE .LT. 1) RETURN

IC = 0

NIBEND = LASTNIBBLE-MOD(LASTNIBBLE,2)

NIBSTART = FIRSTNIBBLE

C HANDLE FIRST NIBBLE IN SECOND HALF OF BYTE

IF(MOD(FIRSTNIBBLE,2) .EQ. 0) THEN

IBYTE = 1 + (FISTNIBBLE-1)/2

CURBYTE = ICHAR(INCHARS(IBYTE))

IF(CURBYTE .LT. 0) CURBYTE = CURBYTE+256

NIBVAL = EVENNIB(CURBYTE+1)

IF(NIBVAL .LT. 0) RETURN

IC = NIBVAL

NIBSTART = NIBSTART+1

ENDIF

C HANDLE FULL BYTES

DO INIBBLE = NIBSTART, NIBEND, 2

IBYTE = 1 + (INIBBLE-1)/2

CURBYTE = ICHAR(INCHARS(IBYTE))

IF(CURBYTE .LT. 0) CURBYTE = CURBYTE + 256

NIBVAL = BOTHNIB(CURBYTE+1)

IF(NIBVAL .LT. 0) RETURN

IC = 100*IC + NIBVAL

ENDDO

C HANDLE LAST NIBBLE IN FIRST HALF OF BYTE

IF(NIBEND .LT. LASTNIBBLE) THEN

IBYTE = 1 + (LASTNIBBLE-1)/2

CURBYTE = ICHAR(INCHARS(IBYTE))

IF(CURBYTE .LT. 0) CURBYTE = CURBYTE+256

NIBVAL = ODDNIB(CURBYTE+1)

IF(NIBVAL .LT. 0) RETURN

IC = 10*IC + NIBVAL

ENDIF

ENDDO

GET_BCD_VALUE = IC

RETURN

END

With the above assortment of routines, it is a pedestrian task to read

and decode the Ekofisk SEG-D files. Well, almost.

There is one final gotcha: some of the records were too short due to

missing traces and this information was lost when the tapes were copied

to disk as just a contiguous set of bytes without any separation between

consecutive records. As a result, blindly reading the promised 15984

traces in each record fails. There are two avenues to resolve this

issue:

Recopy the tapes with encapsulation that tells where each record

ends, or

Add code to try to detect an unexpected general header block #1

when a trace header was expected and recover gracefully.

For these data, I used the second option, looking for a scan type of 8016

and a channel set number 5816 in bytes 3 and 4 of each trace header. This

matches the 8058 BCD value for the format type in the general header of

these Ekofisk data.

0000000: 3901 8058 1234 5678 9000 1112 9708 2020 9..X.4Vx......

0000010: 4700 0000 0000 2010 009f ff01 9600 01ff G..... .........

0000020: 0000 0000 0000 0001 0000 0100 0000 0027 ...............'

0000030: 1000 0200 0000 0000 0000 0000 0000 0000 ................

0000040: 0101 0000 1388 0000 0054 1000 0223 0293 .........T...#..

0000050: 0000 0000 0000 0000 0000 0000 0300 0101 ................

0000060: 0102 0000 1388 0000 0091 1000 0223 0293 .............#..

0000070: 0000 0000 0000 0000 0000 0000 0300 0201 ................

0000080: 0103 0000 1388 0000 0138 1000 0223 0293 .........8...#..

0000090: 0000 0000 0000 0000 0000 0000 0300 0301 ................

00000a0: 0104 0000 1388 0000 0182 1000 0223 0293 .............#..

00000b0: 0000 0000 0000 0000 0000 0000 0300 0401 ................

00000c0: 0105 0000 1388 0000 0206 1000 0223 0293 .............#..

00000d0: 0000 0000 0000 0000 0000 0000 0300 0501 ................

00000e0: 0106 0000 1388 0000 0221 1000 0223 0293 .........!...#..

00000f0: 0000 0000 0000 0000 0000 0000 0300 0601 ................

0000100: 0107 0000 1388 0000 0228 1000 0223 0293 .........(...#..

0000110: 0000 0000 0000 0000 0000 0000 0300 0701 ................

0000120: 0108 0000 1388 0000 0232 1000 0223 0293 .........2...#..

0000130: 0000 0000 0000 0000 0000 0000 0300 0801 ................

0000140: 0109 0000 1388 0000 0235 1000 0223 0293 .........5...#..

0000150: 0000 0000 0000 0000 0000 0000 0300 0901 ................

0000160: 0110 0000 1388 0000 0238 1000 0223 0293 .........8...#..

0000170: 0000 0000 0000 0000 0000 0000 0300 1001 ................

0000180: 0111 0000 1388 0000 0228 1000 0223 0293 .........(...#..

0000190: 0000 0000 0000 0000 0000 0000 0300 1101 ................

00001a0: 0112 0000 1388 0000 0225 1000 0223 0293 .........%...#..

00001b0: 0000 0000 0000 0000 0000 0000 0300 1201 ................

00001c0: 0113 0000 1388 0000 0216 1000 0223 0293 .............#..

00001d0: 0000 0000 0000 0000 0000 0000 0300 1301 ................

00001e0: 0114 0000 1388 0000 0214 1000 0223 0293 .............#..

00001f0: 0000 0000 0000 0000 0000 0000 0300 1401 ................

0000200: 0115 0000 1388 0000 0200 1000 0223 0293 .............#..

0000210: 0000 0000 0000 0000 0000 0000 0300 1501 ................

0000220: 0116 0000 1388 0000 0178 1000 0223 0293 .........x...#..

0000230: 0000 0000 0000 0000 0000 0000 0300 1601 ................

0000240: 0117 0000 1388 0000 0160 1000 0223 0293 .........`...#..

0000250: 0000 0000 0000 0000 0000 0000 0300 1701 ................

0000260: 0118 0000 1388 0000 0145 1000 0223 0293 .........E...#..

0000270: 0000 0000 0000 0000 0000 0000 0300 1801 ................

0000280: 0119 0000 1388 0000 0134 1000 0223 0293 .........4...#..

0000290: 0000 0000 0000 0000 0000 0000 0300 1901 ................

00002a0: 0120 0000 1388 0000 0123 1000 0223 0293 . .......#...#..

00002b0: 0000 0000 0000 0000 0000 0000 0300 2001 .............. .

00002c0: 0121 0000 1388 0000 0110 1000 0223 0293 .!...........#..

00002d0: 0000 0000 0000 0000 0000 0000 0300 2101 ..............!.

00002e0: 0122 0000 1388 0000 0097 1000 0223 0293 ."...........#..

00002f0: 0000 0000 0000 0000 0000 0000 0300 2201 ..............".

0000300: 0123 0000 1388 0000 0075 1000 0223 0293 .#.......u...#..

0000310: 0000 0000 0000 0000 0000 0000 0300 2301 ..............#.

0000320: 0124 0000 1388 0000 0036 1000 0223 0293 .$.......6...#..

0000330: 0000 0000 0000 0000 0000 0000 0300 2401 ..............$.

0000340: 0125 0000 1388 0000 0054 1000 0223 0293 .%.......T...#..

0000350: 0000 0000 0000 0000 0000 0000 0300 0101 ................

0000360: 0126 0000 1388 0000 0091 1000 0223 0293 .&...........#..

0000370: 0000 0000 0000 0000 0000 0000 0300 0201 ................

0000380: 0127 0000 1388 0000 0138 1000 0223 0293 .'.......8...#..

0000390: 0000 0000 0000 0000 0000 0000 0300 0301 ................

00003a0: 0128 0000 1388 0000 0182 1000 0223 0293 .(...........#..

00003b0: 0000 0000 0000 0000 0000 0000 0300 0401 ................

00003c0: 0129 0000 1388 0000 0206 1000 0223 0293 .)...........#..

00003d0: 0000 0000 0000 0000 0000 0000 0300 0501 ................

00003e0: 0130 0000 1388 0000 0221 1000 0223 0293 .0.......!...#..

00003f0: 0000 0000 0000 0000 0000 0000 0300 0601 ................

0000400: 0131 0000 1388 0000 0228 1000 0223 0293 .1.......(...#..

0000410: 0000 0000 0000 0000 0000 0000 0300 0701 ................

0000420: 0132 0000 1388 0000 0232 1000 0223 0293 .2.......2...#..

0000430: 0000 0000 0000 0000 0000 0000 0300 0801 ................

0000440: 0133 0000 1388 0000 0235 1000 0223 0293 .3.......5...#..

0000450: 0000 0000 0000 0000 0000 0000 0300 0901 ................

0000460: 0134 0000 1388 0000 0238 1000 0223 0293 .4.......8...#..

0000470: 0000 0000 0000 0000 0000 0000 0300 1001 ................

0000480: 0135 0000 1388 0000 0228 1000 0223 0293 .5.......(...#..

0000490: 0000 0000 0000 0000 0000 0000 0300 1101 ................

00004a0: 0136 0000 1388 0000 0225 1000 0223 0293 .6.......%...#..

00004b0: 0000 0000 0000 0000 0000 0000 0300 1201 ................

00004c0: 0137 0000 1388 0000 0216 1000 0223 0293 .7...........#..

00004d0: 0000 0000 0000 0000 0000 0000 0300 1301 ................

00004e0: 0138 0000 1388 0000 0214 1000 0223 0293 .8...........#..

00004f0: 0000 0000 0000 0000 0000 0000 0300 1401 ................

0000500: 0139 0000 1388 0000 0200 1000 0223 0293 .9...........#..

0000510: 0000 0000 0000 0000 0000 0000 0300 1501 ................

0000520: 0140 0000 1388 0000 0178 1000 0223 0293 [email protected]...#..

0000530: 0000 0000 0000 0000 0000 0000 0300 1601 ................

0000540: 0141 0000 1388 0000 0160 1000 0223 0293 .A.......`...#..

0000550: 0000 0000 0000 0000 0000 0000 0300 1701 ................

0000560: 0142 0000 1388 0000 0145 1000 0223 0293 .B.......E...#..

0000570: 0000 0000 0000 0000 0000 0000 0300 1801 ................

0000580: 0143 0000 1388 0000 0134 1000 0223 0293 .C.......4...#..

0000590: 0000 0000 0000 0000 0000 0000 0300 1901 ................

00005a0: 0144 0000 1388 0000 0123 1000 0223 0293 .D.......#...#..

00005b0: 0000 0000 0000 0000 0000 0000 0300 2001 .............. .

00005c0: 0145 0000 1388 0000 0110 1000 0223 0293 .E...........#..

00005d0: 0000 0000 0000 0000 0000 0000 0300 2101 ..............!.

00005e0: 0146 0000 1388 0000 0097 1000 0223 0293 .F...........#..

00005f0: 0000 0000 0000 0000 0000 0000 0300 2201 ..............".

0000600: 0147 0000 1388 0000 0075 1000 0223 0293 .G.......u...#..

0000610: 0000 0000 0000 0000 0000 0000 0300 2301 ..............#.

0000620: 0148 0000 1388 0000 0036 1000 0223 0293 .H.......6...#..

0000630: 0000 0000 0000 0000 0000 0000 0300 2401 ..............$.

0000640: 0149 0000 1388 0000 0054 1000 0223 0293 .I.......T...#..

0000650: 0000 0000 0000 0000 0000 0000 0300 0101 ................

0000660: 0150 0000 1388 0000 0091 1000 0223 0293 .P...........#..

0000670: 0000 0000 0000 0000 0000 0000 0300 0201 ................

0000680: 0151 0000 1388 0000 0138 1000 0223 0293 .Q.......8...#..

0000690: 0000 0000 0000 0000 0000 0000 0300 0301 ................

00006a0: 0152 0000 1388 0000 0182 1000 0223 0293 .R...........#..

00006b0: 0000 0000 0000 0000 0000 0000 0300 0401 ................

00006c0: 0153 0000 1388 0000 0206 1000 0223 0293 .S...........#..

00006d0: 0000 0000 0000 0000 0000 0000 0300 0501 ................

00006e0: 0154 0000 1388 0000 0221 1000 0223 0293 .T.......!...#..

00006f0: 0000 0000 0000 0000 0000 0000 0300 0601 ................

0000700: 0155 0000 1388 0000 0228 1000 0223 0293 .U.......(...#..

0000710: 0000 0000 0000 0000 0000 0000 0300 0701 ................

0000720: 0156 0000 1388 0000 0232 1000 0223 0293 .V.......2...#..

0000730: 0000 0000 0000 0000 0000 0000 0300 0801 ................

0000740: 0157 0000 1388 0000 0235 1000 0223 0293 .W.......5...#..

0000750: 0000 0000 0000 0000 0000 0000 0300 0901 ................

0000760: 0158 0000 1388 0000 0238 1000 0223 0293 .X.......8...#..

0000770: 0000 0000 0000 0000 0000 0000 0300 1001 ................

0000780: 0159 0000 1388 0000 0228 1000 0223 0293 .Y.......(...#..

0000790: 0000 0000 0000 0000 0000 0000 0300 1101 ................

00007a0: 0160 0000 1388 0000 0225 1000 0223 0293 .`.......%...#..

00007b0: 0000 0000 0000 0000 0000 0000 0300 1201 ................

00007c0: 0161 0000 1388 0000 0216 1000 0223 0293 .a...........#..

00007d0: 0000 0000 0000 0000 0000 0000 0300 1301 ................

00007e0: 0162 0000 1388 0000 0214 1000 0223 0293 .b...........#..

00007f0: 0000 0000 0000 0000 0000 0000 0300 1401 ................

0000800: 0163 0000 1388 0000 0200 1000 0223 0293 .c...........#..

0000810: 0000 0000 0000 0000 0000 0000 0300 1501 ................

0000820: 0164 0000 1388 0000 0178 1000 0223 0293 .d.......x...#..

0000830: 0000 0000 0000 0000 0000 0000 0300 1601 ................

0000840: 0165 0000 1388 0000 0160 1000 0223 0293 .e.......`...#..

0000850: 0000 0000 0000 0000 0000 0000 0300 1701 ................

0000860: 0166 0000 1388 0000 0145 1000 0223 0293 .f.......E...#..

0000870: 0000 0000 0000 0000 0000 0000 0300 1801 ................

0000880: 0167 0000 1388 0000 0134 1000 0223 0293 .g.......4...#..

0000890: 0000 0000 0000 0000 0000 0000 0300 1901 ................

00008a0: 0168 0000 1388 0000 0123 1000 0223 0293 .h.......#...#..

00008b0: 0000 0000 0000 0000 0000 0000 0300 2001 .............. .

00008c0: 0169 0000 1388 0000 0110 1000 0223 0293 .i...........#..

00008d0: 0000 0000 0000 0000 0000 0000 0300 2101 ..............!.

00008e0: 0170 0000 1388 0000 0097 1000 0223 0293 .p...........#..

00008f0: 0000 0000 0000 0000 0000 0000 0300 2201 ..............".

0000900: 0171 0000 1388 0000 0075 1000 0223 0293 .q.......u...#..

0000910: 0000 0000 0000 0000 0000 0000 0300 2301 ..............#.

0000920: 0172 0000 1388 0000 0036 1000 0223 0293 .r.......6...#..

0000930: 0000 0000 0000 0000 0000 0000 0300 2401 ..............$.

0000940: 0173 0000 1388 0000 0054 1000 0223 0293 .s.......T...#..

0000950: 0000 0000 0000 0000 0000 0000 0300 0101 ................

0000960: 0174 0000 1388 0000 0091 1000 0223 0293 .t...........#..

0000970: 0000 0000 0000 0000 0000 0000 0300 0201 ................

0000980: 0175 0000 1388 0000 0138 1000 0223 0293 .u.......8...#..

0000990: 0000 0000 0000 0000 0000 0000 0300 0301 ................

00009a0: 0176 0000 1388 0000 0182 1000 0223 0293 .v...........#..

00009b0: 0000 0000 0000 0000 0000 0000 0300 0401 ................

00009c0: 0177 0000 1388 0000 0206 1000 0223 0293 .w...........#..

00009d0: 0000 0000 0000 0000 0000 0000 0300 0501 ................

00009e0: 0178 0000 1388 0000 0221 1000 0223 0293 .x.......!...#..

00009f0: 0000 0000 0000 0000 0000 0000 0300 0601 ................

0000a00: 0179 0000 1388 0000 0228 1000 0223 0293 .y.......(...#..

0000a10: 0000 0000 0000 0000 0000 0000 0300 0701 ................

0000a20: 0180 0000 1388 0000 0232 1000 0223 0293 .........2...#..

0000a30: 0000 0000 0000 0000 0000 0000 0300 0801 ................

0000a40: 0181 0000 1388 0000 0235 1000 0223 0293 .........5...#..

0000a50: 0000 0000 0000 0000 0000 0000 0300 0901 ................

0000a60: 0182 0000 1388 0000 0238 1000 0223 0293 .........8...#..

0000a70: 0000 0000 0000 0000 0000 0000 0300 1001 ................

0000a80: 0183 0000 1388 0000 0228 1000 0223 0293 .........(...#..

0000a90: 0000 0000 0000 0000 0000 0000 0300 1101 ................

0000aa0: 0184 0000 1388 0000 0225 1000 0223 0293 .........%...#..

0000ab0: 0000 0000 0000 0000 0000 0000 0300 1201 ................

0000ac0: 0185 0000 1388 0000 0216 1000 0223 0293 .............#..

0000ad0: 0000 0000 0000 0000 0000 0000 0300 1301 ................

0000ae0: 0186 0000 1388 0000 0214 1000 0223 0293 .............#..

0000af0: 0000 0000 0000 0000 0000 0000 0300 1401 ................

0000b00: 0187 0000 1388 0000 0200 1000 0223 0293 .............#..

0000b10: 0000 0000 0000 0000 0000 0000 0300 1501 ................

0000b20: 0188 0000 1388 0000 0178 1000 0223 0293 .........x...#..

0000b30: 0000 0000 0000 0000 0000 0000 0300 1601 ................

0000b40: 0189 0000 1388 0000 0160 1000 0223 0293 .........`...#..

0000b50: 0000 0000 0000 0000 0000 0000 0300 1701 ................

0000b60: 0190 0000 1388 0000 0145 1000 0223 0293 .........E...#..

0000b70: 0000 0000 0000 0000 0000 0000 0300 1801 ................

0000b80: 0191 0000 1388 0000 0134 1000 0223 0293 .........4...#..

0000b90: 0000 0000 0000 0000 0000 0000 0300 1901 ................

0000ba0: 0192 0000 1388 0000 0123 1000 0223 0293 .........#...#..

0000bb0: 0000 0000 0000 0000 0000 0000 0300 2001 .............. .

0000bc0: 0193 0000 1388 0000 0110 1000 0223 0293 .............#..

0000bd0: 0000 0000 0000 0000 0000 0000 0300 2101 ..............!.

0000be0: 0194 0000 1388 0000 0097 1000 0223 0293 .............#..

0000bf0: 0000 0000 0000 0000 0000 0000 0300 2201 ..............".

0000c00: 0195 0000 1388 0000 0075 1000 0223 0293 .........u...#..

0000c10: 0000 0000 0000 0000 0000 0000 0300 2301 ..............#.

0000c20: 0196 0000 1388 0000 0036 1000 0223 0293 .........6...#..

0000c30: 0000 0000 0000 0000 0000 0000 0300 2401 ..............$.

0000c40: 0000 0000 0000 0000 0000 0000 0000 0000 ................

0000c50: 0000 0000 0000 0000 0000 0000 0000 0000 ................

0000c60: 0701 00c0 0101 0000 0000 0000 0000 00ff ................

0000c70: 4859 4452 4f4e 4156 0106 00b0 0100 00ff HYDRONAV........

0000c80: 4040 4055 4845 4144 3038 3a32 303a 3230 @@@UHEAD08:20:20

0000c90: 3a30 3030 3030 302c 312c 202a 554e 4445 :000000,1, *UNDE

0000ca0: 462a 2c20 2020 3538 3030 2c31 3239 3720 F*, 5800,1297

0000cb0: 3030 3030 302c 2036 3236 3537 3434 2e30 00000, 6265744.0

0000cc0: 304e 2c20 2035 3130 3435 362e 3030 452c 0N, 510456.00E,

0000cd0: 2020 352e 3030 4b54 2c31 3830 2e30 3044 5.00KT,180.00D

0000ce0: 472c 2020 302e 304d 2c32 342f 3130 2f32 G, 0.0M,24/10/2

0000cf0: 3031 312c 2020 2020 304d 2c20 2020 2020 011, 0M,

0000d00: 2020 304d 2c32 2c20 2030 2e30 4d2c 7061 0M,2, 0.0M,pa

0000d10: 7373 6976 655f 3131 3130 3234 5f31 2aff ssive_111024_1*.

0000d20: 0000 0000 0000 0000 0000 0000 0000 0000 ................

*

0002c60: 3901 0101 0001 0000 0003 0000 0000 0000 9...............

0002c70: 0000 0000 0000 0100 0001 0000 1388 0000 ................

0002c80: 0000 0000 0000 0000 071a 1100 0502 1503 ................

0002c90: e900 0036 48f9 3f2c 4abf 371e 3fbe b852 ...6H.?,J.7.?..R

0002ca0: 0000 0000 0000 0000 0000 0000 4233 70a4 ............B3p.

0002cb0: 0000 0000 0000 0000 0000 0000 0000 0000 ................

0002cc0: 0084 2100 0000 0000 0000 0000 0000 0000 ..!.............

0002cd0: 0000 0000 3f4d 6438 3f4c 8105 3f4c af0f ....?Md8?L..?L..

0002ce0: 3f4d 4f1a 3f4f 2e21 3f4d e19b 3f4d 08e2 ?MO.?O.!?M..?M..

0002cf0: 3f4d fb8c 3f4c 6a33 3f4d 2a0d 3f4e 6032 ?M..?Lj3?M*.?N`2

0002d00: 3f4d ff7d 3f4d b1b1 3f4d 89a4 3f4c f713 ?M.}?M..?M..?L..

0002d10: 3f4d 739a 3f4d f0a5 3f4d ef4a 3f4e 0f65 ?Ms.?M..?M.J?N.e

0002d20: 3f4c 67c9 3f4c 86d2 3f4d e00e 3f4e 6e86 ?Lg.?L..?M..?Nn.

0002d30: 3f4d f9e1 3f4d 2a43 3f4d 4f45 3f4d 69a0 ?M..?M*C?MOE?Mi.

0002d40: 3f4e 4cb9 3f4d 66d4 3f4c ed7a 3f4d f8ed ?NL.?Mf.?L.z?M..

0002d50: 3f4d acc3 3f4e 05bc 3f4d e8b0 3f4c 9eab ?M..?N..?M..?L..

0002d60: 3f4d f4ea 3f4e 3abb 3f4d 5095 3f4e a9c6 ?M..?N:.?MP.?N..

0002d70: 3f4e 303a 3f4d 0a83 3f4d 7333 3f4c c343 ?N0:?M..?Ms3?L.C

0002d80: 3f4e 79b7 3f4e 4b0b 3f4c e76d 3f4e 1533 ?Ny.?NK.?L.m?N.3

0002d90: 3f4d 53b0 3f4d 2ca7 3f4f 2de5 3f4e 720d ?MS.?M,.?O-.?Nr.

0002da0: 3f4b a39a 3f4e 80af 3f4e 0a25 3f4c dc85 ?K..?N..?N.%?L..

0002db0: 3f4d f322 3f4c f000 3f4c ea1d 3f4c c756 ?M."?L..?L..?L.V

0002dc0: 3f4d e485 3f4e 1cc0 3f4d 79ac 3f4c 680d ?M..?N..?My.?Lh.

0002dd0: 3f4c ff5a 3f4d de20 3f4e 538c 3f4d 8266 ?L.Z?M. ?NS.?M.f

0002de0: 3f4d 252e 3f4d 996d 3f4d 457b 3f4e 6a55 ?M%.?M.m?ME{?NjU

0002df0: 3f4d 3118 3f4d 3fa5 3f4c 8e68 3f4c de15 ?M1.?M?.?L.h?L..

0002e00: 3f4e e4db 3f4d de3f 3f4e 09f3 3f4e 982d ?N..?M.??N..?N.-

0002e10: 3f4d 4072 3f4b f1d0 3f4e 89fb 3f4d c259 ?M@r?K..?N..?M.Y

0002e20: 3f4c 8310 3f4e 071d 3f4d 715f 3f4e 00ea ?L..?N..?Mq_?N..

0002e30: 3f4e 7b55 3f4e 2e2c 3f4d 4fa9 3f4e 68ba ?N{U?N.,?MO.?Nh.

0002e40: 3f4e d12b 3f4d 2ad2 3f4d 9c74 3f4c 70e1 ?N.+?M*.?M.t?Lp.