wowlib 0.0.0
Read & write World of Warcraft client files — a C++26 core
Loading...
Searching...
No Matches
binary.hpp
Go to the documentation of this file.
1#pragma once
2
24
25#include <cstdint>
26#include <type_traits>
27
29
30namespace wowlib::db::wdc {
32 inline constexpr std::uint32_t Wdc1Magic = formats::fourcc("WDC1", formats::FourCCEndian::Forward);
33
35 inline constexpr std::uint32_t Wdc3Magic = formats::fourcc("WDC3", formats::FourCCEndian::Forward);
36
38 inline constexpr std::uint32_t Wdc4Magic = formats::fourcc("WDC4", formats::FourCCEndian::Forward);
39
41 inline constexpr std::uint32_t Wdc5Magic = formats::fourcc("WDC5", formats::FourCCEndian::Forward);
42
47 constexpr bool isWdcMagic(std::uint32_t magic) {
48 return magic == Wdc1Magic || magic == Wdc3Magic || magic == Wdc4Magic || magic == Wdc5Magic;
49 }
50
52 enum WdcFlags : std::uint16_t {
57 };
58
63 struct Wdc1Header {
64 std::uint32_t magic = Wdc1Magic;
65 std::uint32_t recordCount = 0;
66 std::uint32_t fieldCount = 0;
67 std::uint32_t recordSize = 0;
68 std::uint32_t stringTableSize = 0;
69 std::uint32_t tableHash = 0;
70 std::uint32_t layoutHash = 0;
71 std::uint32_t minId = 0;
72 std::uint32_t maxId = 0;
73 std::uint32_t locale = 0;
74 std::uint32_t copyTableSize = 0;
75 std::uint16_t flags = 0;
76 std::uint16_t idIndex = 0;
77 std::uint32_t totalFieldCount = 0;
78 std::uint32_t bitpackedDataOffset = 0;
79 std::uint32_t lookupColumnCount = 0;
80 std::uint32_t offsetMapOffset = 0;
82 std::uint32_t idListSize = 0;
83 std::uint32_t fieldStorageInfoSize = 0;
84 std::uint32_t commonDataSize = 0;
85 std::uint32_t palletDataSize = 0;
86 std::uint32_t relationshipDataSize = 0;
87 };
88
89 static_assert(sizeof(Wdc1Header) == 84 && std::is_trivially_copyable_v<Wdc1Header>);
90
93 struct Wdc3Header {
94 std::uint32_t magic = Wdc3Magic;
95 std::uint32_t recordCount = 0;
96 std::uint32_t fieldCount = 0;
97 std::uint32_t recordSize = 0;
98 std::uint32_t stringTableSize = 0;
99 std::uint32_t tableHash = 0;
100 std::uint32_t layoutHash = 0;
101 std::uint32_t minId = 0;
102 std::uint32_t maxId = 0;
103 std::uint32_t locale = 0;
104 std::uint16_t flags = 0;
105 std::uint16_t idIndex = 0;
106 std::uint32_t totalFieldCount = 0;
107 std::uint32_t bitpackedDataOffset = 0;
108 std::uint32_t lookupColumnCount = 0;
109 std::uint32_t fieldStorageInfoSize = 0;
110 std::uint32_t commonDataSize = 0;
111 std::uint32_t palletDataSize = 0;
112 std::uint32_t sectionCount = 0;
113 };
114
115 static_assert(sizeof(Wdc3Header) == 72 && std::is_trivially_copyable_v<Wdc3Header>);
116
121 std::uint32_t versionNum = 5;
122 char schemaString[128] = {};
123 };
124
125 static_assert(sizeof(Wdc5HeaderPrefix) == 132 && std::is_trivially_copyable_v<Wdc5HeaderPrefix>);
126
129 std::uint64_t tactKeyHash = 0;
130 std::uint32_t fileOffset = 0;
131 std::uint32_t recordCount = 0;
132 std::uint32_t stringTableSize = 0;
133 std::uint32_t offsetRecordsEnd = 0;
134 std::uint32_t idListSize = 0;
135 std::uint32_t relationshipDataSize = 0;
136 std::uint32_t offsetMapIdCount = 0;
137 std::uint32_t copyTableCount = 0;
138 };
139
140 static_assert(sizeof(Wdc3SectionHeader) == 40 && std::is_trivially_copyable_v<Wdc3SectionHeader>);
141
145 std::int16_t size = 0;
146 std::uint16_t position = 0;
147 };
148
149 static_assert(sizeof(WdcFieldStructure) == 4);
150
152 enum class WdcCompression : std::uint32_t {
153 None = 0,
157 Pallet = 3,
161 };
162
168 std::uint16_t fieldOffsetBits = 0;
169 std::uint16_t fieldSizeBits = 0;
170 std::uint32_t additionalDataSize = 0;
172 std::uint32_t val1 = 0;
173 std::uint32_t val2 = 0;
174 std::uint32_t val3 = 0;
176 };
177
178 static_assert(sizeof(WdcFieldStorage) == 24 && std::is_trivially_copyable_v<WdcFieldStorage>);
179}
FourCC chunk identifiers: compile-time conversion of the four-letter codes to the host integers chunk...
WdcCompression
How a column is packed (field_storage_info.storageType).
Definition binary.hpp:152
@ Bitpacked
Bit-addressed unsigned value (signed in WDC1 when the entry's flags word carries bit 0x01).
Definition binary.hpp:154
@ None
Stored inline at a byte offset, fieldSizeBits wide.
Definition binary.hpp:153
@ BitpackedSigned
Bit-addressed signed value, sign-extended (WDC2+ only; WDC1 spells it Bitpacked + flags 0x01).
Definition binary.hpp:159
@ CommonData
Sparse per-id override table; default when an id is absent.
Definition binary.hpp:156
@ PalletArray
Bit-addressed index into palletData (array per slot).
Definition binary.hpp:158
@ Pallet
Bit-addressed index into palletData (one value per slot).
Definition binary.hpp:157
constexpr bool isWdcMagic(std::uint32_t magic)
Whether magic names a format of the WDC family this codec speaks.
Definition binary.hpp:47
constexpr std::uint32_t Wdc3Magic
The WDC3 magic as memcpy'd off the file front (the bytes "WDC3").
Definition binary.hpp:35
constexpr std::uint32_t Wdc4Magic
The WDC4 magic as memcpy'd off the file front (the bytes "WDC4").
Definition binary.hpp:38
WdcFlags
WDC header flag bits (shared by the whole family).
Definition binary.hpp:52
@ WdcFlagSparse
Offset-map layout + inline null-terminated strings.
Definition binary.hpp:53
@ WdcFlagNoninlineId
The id lives in the idList, not the record.
Definition binary.hpp:56
@ WdcFlagSecondary
Secondary-key data; in WDC4+ also reorders the sparse id list ahead of the relationship block.
Definition binary.hpp:54
constexpr std::uint32_t Wdc1Magic
The WDC1 magic as memcpy'd off the file front (the bytes "WDC1").
Definition binary.hpp:32
constexpr std::uint32_t Wdc5Magic
The WDC5 magic as memcpy'd off the file front (the bytes "WDC5").
Definition binary.hpp:41
constexpr std::uint32_t fourcc(const char(&cc)[5], FourCCEndian endian=FourCCEndian::Reversed)
The host integer a scanned chunk id compares equal to for code cc.
Definition fourcc.hpp:33
@ Forward
The characters are stored as written: 'AFID' appears in the file as the bytes "AFID".
Definition fourcc.hpp:22
The 84-byte WDC1 top header.
Definition binary.hpp:63
std::uint16_t idIndex
Column index of the inline id (when not flag 0x04).
Definition binary.hpp:76
std::uint32_t lookupColumnCount
Definition binary.hpp:79
std::uint32_t copyTableSize
Copy-table bytes ({newId, srcId} pairs).
Definition binary.hpp:74
std::uint32_t fieldStorageInfoSize
Bytes of the field_storage_info table (24 each).
Definition binary.hpp:83
std::uint32_t totalFieldCount
Equal to fieldCount in every observed file.
Definition binary.hpp:77
std::uint32_t relationshipDataSize
Definition binary.hpp:86
std::uint32_t palletDataSize
Definition binary.hpp:85
std::uint32_t recordSize
Fixed record stride in bytes (non-sparse).
Definition binary.hpp:67
std::uint32_t tableHash
SStrHash of the uppercased table name.
Definition binary.hpp:69
std::uint32_t layoutHash
Structure hash; matches a DBD LAYOUT.
Definition binary.hpp:70
std::uint32_t fieldCount
Stored columns; a non-inline id is not counted.
Definition binary.hpp:66
std::uint32_t commonDataSize
Definition binary.hpp:84
std::uint16_t flags
See WdcFlags.
Definition binary.hpp:75
std::uint32_t bitpackedDataOffset
First bit-packed field's byte offset in a record.
Definition binary.hpp:78
std::uint32_t offsetMapOffset
Absolute offset of the sparse offset map ({uint32 offset, uint16 size}[maxId - minId + 1]).
Definition binary.hpp:80
std::uint32_t stringTableSize
Definition binary.hpp:68
std::uint32_t idListSize
idList bytes (uint32 each) when flag 0x04.
Definition binary.hpp:82
std::uint32_t recordCount
Definition binary.hpp:65
The 72-byte WDC3 top header (WDC4 reuses it verbatim; WDC5 prepends Wdc5HeaderPrefix in front of the ...
Definition binary.hpp:93
std::uint32_t lookupColumnCount
Definition binary.hpp:108
std::uint32_t totalFieldCount
Columns incl.
Definition binary.hpp:106
std::uint32_t recordSize
Fixed record stride in bytes (non-sparse).
Definition binary.hpp:97
std::uint32_t recordCount
Total records across sections (unencrypted).
Definition binary.hpp:95
std::uint32_t palletDataSize
Definition binary.hpp:111
std::uint32_t bitpackedDataOffset
First bit-packed field's byte offset in a record.
Definition binary.hpp:107
std::uint32_t sectionCount
Definition binary.hpp:112
std::uint32_t tableHash
SStrHash of the uppercased table name.
Definition binary.hpp:99
std::uint32_t layoutHash
Structure hash; matches a DBD LAYOUT.
Definition binary.hpp:100
std::uint16_t flags
See WdcFlags.
Definition binary.hpp:104
std::uint16_t idIndex
Column index of the inline id (when not flag 0x04).
Definition binary.hpp:105
std::uint32_t stringTableSize
Section 0 string bytes (informational).
Definition binary.hpp:98
std::uint32_t fieldCount
Stored columns; a non-inline id is not counted.
Definition binary.hpp:96
std::uint32_t commonDataSize
Definition binary.hpp:110
std::uint32_t fieldStorageInfoSize
Bytes of the field_storage_info table (24 each).
Definition binary.hpp:109
The 40-byte per-section header of WDC3/WDC4/WDC5.
Definition binary.hpp:128
std::uint32_t offsetRecordsEnd
End of the sparse record region (sparse only).
Definition binary.hpp:133
std::uint32_t offsetMapIdCount
Offset-map entries (sparse only).
Definition binary.hpp:136
std::uint64_t tactKeyHash
TACT key lookup; non-zero = encrypted section.
Definition binary.hpp:129
std::uint32_t recordCount
Records in this section.
Definition binary.hpp:131
std::uint32_t fileOffset
Byte offset of the section's records in the file.
Definition binary.hpp:130
std::uint32_t relationshipDataSize
Relationship block bytes.
Definition binary.hpp:135
std::uint32_t idListSize
idList bytes (uint32 each) when flag 0x04.
Definition binary.hpp:134
std::uint32_t stringTableSize
Section string-block bytes (non-sparse).
Definition binary.hpp:132
std::uint32_t copyTableCount
Copy-table entries ({newId, srcId}).
Definition binary.hpp:137
The 132 bytes WDC5 splices between magic and recordCount: a numeric schema version and a zero-padded ...
Definition binary.hpp:120
The 24-byte field_storage_info entry: how one column is stored.
Definition binary.hpp:167
std::uint32_t val1
bitpacked/pallet: offset bits; common: default value.
Definition binary.hpp:172
std::uint32_t val3
bitpacked: flags (0x01 = signed, WDC1); pallet-array: element count.
Definition binary.hpp:174
std::uint32_t val2
bitpacked/pallet: size bits.
Definition binary.hpp:173
std::uint16_t fieldOffsetBits
Bit offset of the field within a record.
Definition binary.hpp:168
std::uint32_t additionalDataSize
Bytes this field owns in pallet/common blocks.
Definition binary.hpp:170
std::uint16_t fieldSizeBits
Field width in bits (whole array for arrays).
Definition binary.hpp:169
The 4-byte fieldStructure entry: (32 - size) / 8 is the field's storage byte width,...
Definition binary.hpp:144