XOSS NAV & NAV+ RO File Format
This guide documents the XZRoutes v2 binary layout recovered from authentic XOSS NAV/NAV+ files and explains how GPX becomes RO.
The .ro format is proprietary and undocumented. The
verified layout is XZRoutes version 2; compatibility with every XOSS NAV
or XOSS NAV+ firmware release is not guaranteed.
File layout
All multi-byte numbers use little-endian byte order. Coordinates are signed 32-bit integers in millionths of a degree. A file contains these sections in order:
- A fixed 96-byte header.
- A table of 44-byte maneuver records.
- Maneuver geometry as latitude/longitude pairs.
- A zero-filled 32-byte reserved slot per maneuver.
- An
ELEVmarker and elevation samples. - A two-byte CRC-16/MODBUS checksum.
Header
| Offset | Type | Meaning |
|---|---|---|
0x00 |
8 ASCII bytes | XZRoutes signature |
0x08 |
uint32 | Route ID |
0x10 |
uint32 | Complete file size including CRC |
0x14 |
uint16 | Format version; verified value is 2 |
0x16 |
uint16 | Maneuver count |
0x18 |
uint32 | Offset of the first elevation sample |
0x1C |
uint32 | Elevation sample count |
0x20–0x2F |
4 × int32 | Route coordinate bounds |
0x30 |
uint32 | End of maneuver geometry |
0x34 |
uint32 | Likely smoothed ascent; inferred |
0x38 |
uint32 | Route distance in metres |
0x3C |
uint16 | Unknown flag; observed value is 1 |
0x3E |
uint16 | Likely route-name byte limit; observed value is 31 |
0x40–0x5F |
32 bytes | NUL-terminated UTF-8 route name |
Maneuvers and geometry
Each 44-byte maneuver stores its start and end coordinates, direct distance, turn code, uint16 point count, absolute geometry offset, and coordinate bounding box. Its geometry contains repeated endpoints where adjacent maneuvers meet. The reader removes only adjacent boundary duplicates.
After geometry, authentic files contain 32 zero bytes for every maneuver. These bytes appear reserved for instructions or street names, but that interpretation remains unverified.
Elevation and checksum
Twelve bytes before the first elevation sample are the ASCII marker
ELEV, a uint32 sample count, and an observed zero uint32.
Each sample is a uint32 elevation in metres followed by uint32 distance
from the previous sample.
The final two bytes are CRC-16/MODBUS over every preceding byte:
reflected polynomial 0xA001, initial value
0xFFFF, and little-endian output.
Some authentic files do not provide an unambiguous one-to-one elevation match after geometry deduplication. RO-to-GPX conversion then preserves geometry and omits elevation rather than guessing.
How GPX becomes RO
- Read TRK points, or fall back to RTE and WPT points.
- Convert coordinates to millionths of a degree, interpolate missing elevation, and merge adjacent duplicate coordinates.
- Optionally simplify geometry to the editable point target shown under Advanced options.
- Detect turns up to the editable maneuver target, or create one breadcrumb maneuver.
- Write the header, maneuver table, geometry, reserved slots, and ELEV samples.
- Calculate CRC-16/MODBUS and parse the completed binary again before download.
The controls are targets, not hidden device limits. The converter reports only actual binary-field or browser-resource constraints and never silently clamps an entered maximum.