decode static method
Decode frame from bytes
Implementation
static OBPFrame decode(Uint8List data) {
if (data.length < HEADER_SIZE) {
throw FormatException('Frame too short: ${data.length} < $HEADER_SIZE');
}
final buffer = ByteData.sublistView(data);
int offset = 0;
// Check magic
final magic = buffer.getUint32(offset, Endian.big);
if (magic != MAGIC) {
throw FormatException('Invalid magic: 0x${magic.toRadixString(16)} != 0x${MAGIC.toRadixString(16)}');
}
offset += 4;
// Version
final version = buffer.getUint8(offset);
if (version != VERSION) {
throw FormatException('Unsupported version: $version != $VERSION');
}
offset += 1;
// Type
final typeValue = buffer.getUint8(offset);
final type = OBPMessageType.fromValue(typeValue);
offset += 1;
// Flags
final flagsValue = buffer.getUint8(offset);
final flags = OBPFlags.fromValue(flagsValue);
offset += 1;
// Reserved (skip)
offset += 1;
// Length
final length = buffer.getUint32(offset, Endian.big);
if (length > MAX_PAYLOAD_SIZE) {
throw FormatException('Payload too large: $length > $MAX_PAYLOAD_SIZE');
}
offset += 4;
// Stream ID
final streamId = buffer.getUint32(offset, Endian.big);
offset += 4;
// Check total frame size
if (data.length < HEADER_SIZE + length) {
throw FormatException('Incomplete frame: ${data.length} < ${HEADER_SIZE + length}');
}
// Extract payload
final payload = data.sublist(HEADER_SIZE, HEADER_SIZE + length);
return OBPFrame(
version: version,
type: type,
flags: flags,
streamId: streamId,
payload: payload,
);
}