Decoding Ekofisk passive data files - Stanford Universitysep · Decoding Ekofisk passive data files...
Transcript of Decoding Ekofisk passive data files - Stanford Universitysep · Decoding Ekofisk passive data files...
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.