# DataFormat

## class DataFormat( transfer_bits: int, data_width_bits: int | None = None, data_lsb: int = 0, signed: bool = False, scaling: ScalingFunction | None = None, units: str = '', )[source]

Bases: [`object`](https://docs.python.org/3/builtins/functions.html#object "(in Python v3.15)")

How to extract logical data from an I2C transfer and convert to physical units.

Variables:
:   - **transfer_bits** ([*int*](https://docs.python.org/3/builtins/functions.html#int "(in Python v3.15)")) – Total bits transferred over I2C.
    - **data_width_bits** ([*int*](https://docs.python.org/3/builtins/functions.html#int "(in Python v3.15)") *|* *None*) – Logical data width if narrower than transfer_bits; `None` uses all.
    - **data_lsb** ([*int*](https://docs.python.org/3/builtins/functions.html#int "(in Python v3.15)")) – Starting bit position of the logical data.
    - **signed** ([*bool*](https://docs.python.org/3/builtins/functions.html#bool "(in Python v3.15)")) – Whether the logical data is 2’s-complement signed.
    - **scaling** ([*ScalingFunction*](https://dev.nominal.io/instro/ref/instruments/instro.i2c.types.ScalingFunction.md#instro.i2c.types.ScalingFunction "instro.i2c.types.ScalingFunction") *|* *None*) – Optional scaling to convert raw → physical.
    - **units** ([*str*](https://docs.python.org/3/builtins/stdtypes.html#str "(in Python v3.15)")) – Display string for the physical units.

### transfer_bits: int

### data_width_bits: int | None = None

### data_lsb: int = 0

### signed: bool = False

### scaling: ScalingFunction | None = None

### units: str = ''

### property data_width_bytes: int

Return number of bytes for transfer.

### extract_data(transfer_raw: int) → int[source]

Slice the logical data field out of `transfer_raw` (sign-extended when `signed`).

### pack_data(data_raw: int) → int[source]

Pack `data_raw` into the transfer container at `data_lsb`; validates range vs `signed`.

### float_from_raw(transfer_raw: int) → float[source]

Extract logical data and apply `scaling`; falls back to raw float if no scaling is set.

### raw_from_float(physical: float) → int[source]

Pack `physical` into a raw transfer value. Raises `ValueError` if out of range.
