zerodds-cdr
XCDR1/XCDR2 encoder/decoder, endianness, alignment.
Part of ZeroDDS. Safety class SAFE —
forbid(unsafe_code), no_std + alloc.
Quick Start
use ;
// Encoder
let mut w = new;
42u32.encode?;
"hello".to_string.encode?;
let bytes: = w.into_bytes;
// Decoder
let mut r = new;
let n: u32 = u32decode?;
let s: String = Stringdecode?;
assert_eq!;
# Ok::
Structs with Extensibility
use ;
use ;
let mut w = new;
// @final: tight-packed, no header
encode_final?;
// @appendable: 4-byte DHEADER, forward-compatible
encode_appendable?;
// @mutable: one EMHEADER with member ID per member
encode_mutable_member?;
# Ok::
Architecture
┌────────────┐ ┌─────────────┐ ┌──────────────┐ ┌───────────────┐
│ T: CdrEnc. │─▶│ BufferWriter│─▶│ Vec<u8> │─▶│ Wire (UDP/ │
│ (typed val)│ │ (alignment, │ │ (bytes) │ │ Shared-Mem) │
│ │ │ endianness)│ │ │ │ │
└────────────┘ └─────────────┘ └──────────────┘ └───────────────┘
│
▼
┌────────────┐ ┌─────────────┐ ┌──────────────┐ ┌───────────────┐
│ T: CdrDec. │◀─│ BufferReader│◀─│ &[u8] │◀─│ Wire input │
│ (typed val)│ │ │ │ │ │ │
└────────────┘ └─────────────┘ └──────────────┘ └───────────────┘
Modules
| Module | Purpose | Status |
|---|---|---|
error |
EncodeError, DecodeError |
stable |
endianness |
Endianness::{Big, Little} + conversion helpers |
stable |
buffer |
BufferWriter (alloc) + BufferReader with alignment tracking |
stable |
encode |
CdrEncode/CdrDecode traits + primitive impls |
stable |
composite (alloc) |
String/Vec<T>/[T;N]/Option<T> |
stable |
struct_enc (alloc) |
@final/@appendable/@mutable helpers |
stable |
Wire-Format Conformance
OMG XTypes 1.3 §7.4 (CDR Encoding Rules):
- Primitives (§7.4.1): alignment relative to stream start, BE/LE per stream encapsulation
- String (§7.4.4):
uint32length incl. null terminator + UTF-8 +\0 - Sequence (§7.4.4.2):
uint32element count + elements - Array (§7.4.4.3): N elements without length prefix
- Optional (§7.4.5.1.4):
uint8present flag + value @finalstruct (§7.4.5.1.1): tight-packed@appendablestruct (§7.4.3.4.5): DHEADER (uint32 = body length)@mutablestruct (§7.4.3.4.2): EMHEADER (m-bit + LC + 28-bit ID)- NEXTINT
Coverage
- XCDR1 (CDR_BE / CDR_LE) and XCDR2 — both encapsulation schemes complete. XCDR1 for legacy vendor compat (RTI Connext, Cyclone DDS default for small types).
- EMHEADER length codes: LC0..3 + LC4 + LC5..7 — all 8 codes produce byte-identical output to the OMG XTypes 1.3 spec.
- Type-Object encoding (XTypes §7.3) — separate crate
zerodds-types(TypeIdentifier, TypeObject, TypeMap, KeyHash). - Code-gen:
zerodds-idlcemits a CDR encoder + decoder per IDL type; manual calls to the helper functions remain possible.
Tests
License
See the workspace Cargo.toml.