eeu si Segment Classification Table - krcenov/RNS510-Map-Viewer GitHub Wiki
eeu.si โ Segment Classification Table
Status: โ
Cracked ยท 195 KB ยท NOT_COMPRESSED ยท Record framing
cracked and validated at full file scale; all 20 real leaf fields
positioned in exact eeu.mod schema order across the record's 5 real
bytes. 2 of the 20 fields (rank/class/divided and route_num_type/
paved) plus 3 more (driveable_lower/drivable_upper,
tollbooth_direction, restclass) have a joint-exclusivity or fully-
saturated-range validation signal; the final 11 single-bit flags rest on
position + schema-order match alone (2 of those 11 have an extra
corroborating joint-distribution signal โ see below).
A real road-segment classification/attribute table โ road rank, class,
whether it's divided, tolled, paved, and more. Not previously examined โ
only its candidate 8-byte record size (from the shared header's
record_count_lo16 field) and its schema field list (via eeu.mod)
were known going in.
Record format โ cracked, validated at full scale (24,353 records)
94-byte header (record count 24,353 read straight from the header), then
exactly 24,353 fixed 8-byte records: 24,353 ร 8 = 194,824 bytes, an
exact match to the real body size, zero leftover.
bytes[0:5] real per-record data, see below
bytes[5:8] always zero on every record checked (24,353/24,353)
Only 20,381 of 24,353 records have a distinct 5-byte payload โ 3,972 records duplicate another record's exact value. Not a clean dedup table (that would require zero duplicates); more likely allocated per some other axis (e.g. per-region/country) where the same attribute combination legitimately recurs.
eeu.mod's real field list
eeu.mod names this table seginfo, with 20
real leaf fields once the 11 shared header-struct boilerplate strings
are excluded (see Database Schema): rank,
class, divided, [drivables: driveable_lower, drivable_upper],
toll_vignette, toll_road, tollbooth_direction, hwy_complex_bit,
restclass, landmark, dbldig, detailedcity, urban,
bifurcation_left, bifurcation_right, rnc, truck_digitized,
route_num_type, paved.
drivables is (by analogy with eeu.pmm's own type_and_listIndex
wrapper, see
Postal-Code Merge Tables) almost
certainly a struct/group name wrapping its two children
(driveable_lower/drivable_upper), not itself a 21st real field โ
consistent with the inconsistent spelling ("driveable" vs "drivable"),
a real quirk of the original compiler's packing (a single logical value
split low/high across non-adjacent bits), not a project typo.
Cracked: byte 0 = rank / class / divided, in exact schema order
bits[0:3] rank -- values 0-4 ONLY (5,6,7 never observed)
bits[3:7] class -- values 0-12 (13,14,15 never observed)
bit[7] divided -- boolean, 16.30% of records (3,970/24,353)
Cracked: byte 4's low nibble = route_num_type / paved, the exact last 2 fields, in the last real byte
bits[32:35] route_num_type -- values 0-6 ONLY (7 never observed)
bit[35] paved -- boolean, 94.56% of records (23,029/24,353)
Both crackings are validated by:
- exact bit-width match โ the sub-fields sum to a whole byte with no slack bits
- exact schema-order match โ
rank/class/dividedare the first 3 real leaf fields;route_num_type/pavedare the exact last 2 - small/clean bounded value ranges โ none of the 5 sub-fields fills its full bit-width range, consistent with real bounded enums rather than noise
- real-world plausibility โ
divided's ~16% andpaved's ~95% are both realistic rates for a European road network
Not independently confirmed against ground truth โ no populated cross-reference was available this session (see below).
Bytes 1-3 (24 bits), all 15 remaining named fields, in exact schema order throughout
driveable_lower, drivable_upper, toll_vignette, toll_road,
tollbooth_direction, hwy_complex_bit, restclass, landmark,
dbldig, detailedcity, urban, bifurcation_left,
bifurcation_right, rnc, truck_digitized โ 15 real fields, 24 real
bits, of which bits[8:11] (byte 2's low 3 bits) and bit[23] (byte 3's
top bit) are always zero โ 20 real bits of storage for 15 fields.
Cracked: driveable_lower/drivable_upper = byte 1, bits[0:2]
Joint distribution across all 24,353 records: (1,1)=9,258, (0,1)=
7,548, (1,0)=7,547, (0,0)=0 โ these two bits are NEVER both
clear. Exactly matches real-world expectation for a "drivable in the
lower-numbered direction" / "drivable in the upper-numbered direction"
pair: a real road segment must be traversable in at least one direction
(a segment nobody can drive is not a real road), while bidirectional
(1,1) and the two single-direction cases are all real, distinct
possibilities. The near-identical (0,1)/(1,0) counts are consistent
with "lower"/"upper" being an arbitrary node-order label rather than a
real-world-meaningful compass direction.
Cracked (identity): tollbooth_direction = byte 1, bits[4:6]
Joint distribution: (0,0)=23,729 (97.4%), (1,0)=314, (0,1)=310,
(1,1)=0 โ mutually exclusive, both rare (~1.3% each). Matches a
real "which direction requires toll payment" state: not a toll booth;
tolled one way; tolled the other way โ never both.
Cracked (position, plausible identity): restclass = byte 2, bits[3:7]
The 4 bits directly following byte 2's confirmed-always-zero bits[0:3]. All 16 of 16 possible 4-bit values are used across the file โ a fully-saturated range, the cleanest possible signal for a genuine, tightly-packed enum field with no wasted bit (stronger than the 5-bit interpretation tried first, which only used 30/32 values โ bit 7 doesn't belong to this field).
Cracked (position, later pass): the remaining 11 single-bit flags, assigned by exact schema order
The same technique already validated for byte 0 and byte 4:
eeu.mod lists exactly 11 more single-bit
leaf fields after restclass, and exactly 11 real bits remain
unassigned, in the same relative order:
byte 1 bit[2] toll_vignette -- 11.62% (2,831/24,353)
byte 1 bit[3] toll_road -- 14.72% (3,584/24,353)
byte 1 bit[6] hwy_complex_bit -- 2.66% (647/24,353)
byte 2 bit[7] landmark -- 10.84% (2,639/24,353)
byte 3 bit[0] dbldig -- 24.19% (5,891/24,353)
byte 3 bit[1] detailedcity -- 26.69% (6,499/24,353)
byte 3 bit[2] urban -- 56.84% (13,842/24,353)
byte 3 bit[3] bifurcation_left -- 46.69% (11,371/24,353)
byte 3 bit[4] bifurcation_right -- 3.75% (914/24,353)
byte 3 bit[5] rnc -- 3.95% (961/24,353)
byte 3 bit[6] truck_digitized -- 4.98% (1,212/24,353)
toll_vignette/toll_road are schema-adjacent and land in the only 2
bits available in byte 1's gap between drivable_upper and
tollbooth_direction; hwy_complex_bit is the schema's next field
after tollbooth_direction and lands on byte 1's only remaining real
bit; landmark is the schema's next field after restclass and lands
on byte 2's only remaining real bit; the final 7 fields (dbldig
through truck_digitized) match byte 3's 7 real bits (bit[7] confirmed
always zero) 1:1 in schema order with zero slack.
Two independent signals beyond position:
rnc/truck_digitizedare NEVER both set: joint distribution(0,0)=22,180,(0,1)=1,212,(1,0)=961,(1,1)=0 โ the same clean joint-exclusivity signature already used fortollbooth_directionanddriveable_lower/drivable_upper.toll_vignette/toll_roadare almost always mutually exclusive:(0,0)=17,975,(0,1)=3,547,(1,0)=2,794,(1,1)=37 (0.15% of records) โ weaker than a hard rule, but consistent with 2 closely-related "toll payment method" flags that are usually, not always, exclusive (a road could plausibly require both a vignette AND direct tolling in rare cases).
The other 9 fields' individual semantics are not independently
cross-validated โ confidence rests on position + exact schema-order
match + plausible value-rate ranges only, the same standard already
accepted for rank/class/divided/route_num_type/paved.
Tested and refuted: dbldig ("double digitized" โ the real Navteq
term for a divided highway modeled as 2 separate carriageway
geometries) was hypothesized to tightly track divided (byte 0 bit 7).
Joint distribution (divided, dbldig): (0,0)=15,301, (1,0)=3,161,
(0,1)=5,082, (1,1)=809 shows no such coupling โ dbldig is a real,
distinct field, not a redundant re-encoding of divided.
Corrects a previous session's lead: eeu.rd's bytes[1:5] is NOT a direct index into this file
eeu.mod's write-up flagged eeu.si as "a
strong, not-yet-pursued lead" for
eeu.rd's own unresolved bytes[1:5]
("candidate road-class flags"). Originally checked against a since-
corrected "~5 distinct patterns" claim for that field โ a full-file
scan actually finds 6,174 distinct values โ but even with the
correct cardinality, decoding eeu.rd's bytes[1] directly using this
page's own exact rank/class/divided bit layout produces values
filling the FULL 0-7/0-15 range rather than eeu.si's own bounded
0-4/0-12 ranges (and a 46.5% divided-equivalent rate vs. eeu.si's own
16.3%) โ eeu.rd does not directly embed eeu.si-style flags using
that encoding. Also tested (see
Parallel Road Array): eeu.rd's
bytes[1:5] shows no correlation with eeu.iof's own count field
either (r โ -0.02).
This specific cross-reference does not hold up. More
likely: the real seginfoID foreign key lives on the MAP_COMPRESSED
tile format's own segment records โ eeu.mod's
"Ordinary Map File" block independently names a seginfoID field there,
alongside seg/restr_left/restr_right/left_node/right_node/
length โ not on eeu.rd at all. eeu.rd and the MAP_COMPRESSED tile
format are two separate representations of the road network. Not
pursued further this session (would require reopening the tile format's
own segment record parser).
Reader code
research/si_reader.py โ read_si().