From ff550bd105d6f60410d502fae1ab54039fa7c193 Mon Sep 17 00:00:00 2001 From: Christoph Koehler Date: Sun, 19 May 2024 08:55:30 -0600 Subject: [PATCH] patterns: Add Digital Terrain Elevation Data (DTED) pattern file (#243) Tested on DTED0 and DTED2, will likely work with DTED1 as well. --- README.md | 1 + patterns/dted.hexpat | 117 +++++++++++++++++++++++ tests/patterns/test_data/dted.hexpat.dt0 | Bin 0 -> 34162 bytes 3 files changed, 118 insertions(+) create mode 100644 patterns/dted.hexpat create mode 100644 tests/patterns/test_data/dted.hexpat.dt0 diff --git a/README.md b/README.md index d5588d8..4674d18 100644 --- a/README.md +++ b/README.md @@ -49,6 +49,7 @@ Everything will immediately show up in ImHex's Content Store and gets bundled wi | DMG | | [`patterns/dmg.hexpat`](patterns/dmg.hexpat) | Apple Disk Image Trailer (DMG) | | DS_Store | | [`patterns/dsstore.hexpat`](patterns/dsstore.hexpat) | .DS_Store file format | | DTA | | [`patterns/max_v104.hexpat`](patterns/max_v104.hexpat) | Mechanized Assault and Exploration v1.04 (strategy game) save file format | +| DTED | | [`patterns/dted.hexpat`](patterns/dted.hexpat) | Digital Terrain Elevation Data (DTED) | | ELF | `application/x-executable` | [`patterns/elf.hexpat`](patterns/elf.hexpat) | ELF header in elf binaries | | EVTX | | [`patterns/evtx.hexpat`](patterns/evtx.hexpat) | MS Windows Vista Event Log | | FAS | | [`patterns/fas_oskasoftware.hexpat`](patterns/fas_oskasoftware.hexpat) [`patterns/fas_oskasoftware_old.hexpat`](patterns/fas_oskasoftware_old.hexpat) (Old versions of Oska DeskMate) | Oska Software DeskMates FAS (Frames and Sequences) file | diff --git a/patterns/dted.hexpat b/patterns/dted.hexpat new file mode 100644 index 0000000..1f70aa5 --- /dev/null +++ b/patterns/dted.hexpat @@ -0,0 +1,117 @@ +#pragma description Digital Terrain Elevation Data +#pragma endian big + +import std.core; +import std.io; +import std.mem; +import std.string; + + +enum Magic:u24 { + UHL = 0x55484C, + DSI = 0x445349, + ACC = 0x414343, +}; + +struct UHL { + Magic magic; + char one; + char lon[8]; + char lat[8]; + char lon_data_interval[4]; + char lat_data_interval[4]; + char accuracy[4]; + char security_code[3]; + char uniq_ref[12]; + char lon_lines[4]; + char lat_points[4]; + char multi_accuracy; + char reserved[24]; +}; + +struct DSI { + Magic magic; + char classification; + char stuff1[29]; + char stuff2[26]; + char product_level[5]; + char uniq_ref[15]; + char reserved[8]; + char data_edition[2]; + char match_version; + char maint_date[4]; + char match_date[4]; + char main_desc_code[4]; + char producer_code[8]; + char reserved2[16]; + char product_spec[9]; + char numbers[2]; + char product_spec_date[4]; + char vertical_datum[3]; + char horizontal_datum[5]; + char digitizing_system[10]; + char compilation_date[4]; + char reserved3[22]; + char lat_origin[9]; + char lon_origin[10]; + char lat_sw_corner[7]; + char lon_sw_corner[8]; + char lat_nw_corner[7]; + char lon_nw_corner[8]; + char lat_ne_corner[7]; + char lon_ne_corner[8]; + char lat_se_corner[7]; + char lon_se_corner[8]; + char clockwise_orientation[9]; + char lat_interval[4]; + char lon_interval[4]; + char lat_lines[4]; + char lon_lines[4]; + char partial_cell[2]; + char reserved4[101]; + char reserved5[100]; + char reserved6[156]; +}; + +struct ACCSub { + char abs_vertical_accuracy[4]; + char abs_horizontal_accuracy[4]; + char rel_vertical_accuracy[4]; + char rel_horizontal_accuracy[4]; + char num_coords[2]; + char pairs[19*14]; +}; + +struct ACC { + Magic magic; + char abs_horizontal_accuracy[4]; + char abs_vertical_accuracy[4]; + char rel_horizontal_accuracy[4]; + char rel_vertical_accuracy[4]; + char reserved1[4]; + char reserved2[1]; + char reserved3[31]; + char multi_accuracy_outline[2]; // determines sub regions + ACCSub subs[9]; + char reserved4[18]; + char reserved5[69]; + +}; + +struct DataRecords { + char magic; + s24 data_block_count; + s16 lon_count; + s16 lat_count; + s16 elevation[std::string::parse_int(parent.dsi.lat_lines, 10)]; + u32 checksum; +}; + +struct DTED { + UHL uhl; + DSI dsi; + ACC acc; + DataRecords records[std::string::parse_int(this.dsi.lon_lines, 10)]; +}; + +DTED dted @ 0x00; diff --git a/tests/patterns/test_data/dted.hexpat.dt0 b/tests/patterns/test_data/dted.hexpat.dt0 new file mode 100644 index 0000000000000000000000000000000000000000..e059ceb97b168c2fc8317dda5549f0400f2b75ab GIT binary patch literal 34162 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 literal 0 HcmV?d00001