diff --git a/pylabrobot/io/binary.py b/pylabrobot/io/binary.py index 9651abb58c3..0405bfa239f 100644 --- a/pylabrobot/io/binary.py +++ b/pylabrobot/io/binary.py @@ -32,41 +32,57 @@ def __init__(self, little_endian: bool = True): def u8(self, value: int) -> "Writer": """Write unsigned 8-bit integer (0-255).""" + if not 0 <= value <= 0xFF: + raise ValueError(f"u8 requires 0 <= value <= {0xFF}, got {value}") self._buffer.write(struct.pack(f"{self._endian}B", value)) return self def u16(self, value: int) -> "Writer": """Write unsigned 16-bit integer.""" + if not 0 <= value <= 0xFFFF: + raise ValueError(f"u16 requires 0 <= value <= {0xFFFF}, got {value}") self._buffer.write(struct.pack(f"{self._endian}H", value)) return self def u32(self, value: int) -> "Writer": """Write unsigned 32-bit integer.""" + if not 0 <= value <= (1 << 32) - 1: + raise ValueError(f"u32 requires 0 <= value <= {(1 << 32) - 1}, got {value}") self._buffer.write(struct.pack(f"{self._endian}I", value)) return self def u64(self, value: int) -> "Writer": """Write unsigned 64-bit integer.""" + if not 0 <= value <= (1 << 64) - 1: + raise ValueError(f"u64 requires 0 <= value <= {(1 << 64) - 1}, got {value}") self._buffer.write(struct.pack(f"{self._endian}Q", value)) return self def i8(self, value: int) -> "Writer": """Write signed 8-bit integer (-128 to 127).""" + if not -(1 << 7) <= value <= (1 << 7) - 1: + raise ValueError(f"i8 requires {-(1 << 7)} <= value <= {(1 << 7) - 1}, got {value}") self._buffer.write(struct.pack(f"{self._endian}b", value)) return self def i16(self, value: int) -> "Writer": """Write signed 16-bit integer.""" + if not -(1 << 15) <= value <= (1 << 15) - 1: + raise ValueError(f"i16 requires {-(1 << 15)} <= value <= {(1 << 15) - 1}, got {value}") self._buffer.write(struct.pack(f"{self._endian}h", value)) return self def i32(self, value: int) -> "Writer": """Write signed 32-bit integer.""" + if not -(1 << 31) <= value <= (1 << 31) - 1: + raise ValueError(f"i32 requires {-(1 << 31)} <= value <= {(1 << 31) - 1}, got {value}") self._buffer.write(struct.pack(f"{self._endian}i", value)) return self def i64(self, value: int) -> "Writer": """Write signed 64-bit integer.""" + if not -(1 << 63) <= value <= (1 << 63) - 1: + raise ValueError(f"i64 requires {-(1 << 63)} <= value <= {(1 << 63) - 1}, got {value}") self._buffer.write(struct.pack(f"{self._endian}q", value)) return self