3. Signals: from physical value to bits
#Message and signal
A CAN frame has up to 8 bytes (64 bits) of data. A single value rarely fills the whole frame: the manufacturer divides the bytes into several signals. An engine frame might carry, for example, engine speed in 16 bits, temperature in 8 bits, throttle position in 8 bits and a few 1-bit switches.
To read or write a signal you need to know exactly:
- Start bit and length: where the signal starts within the frame and how many bits it occupies.
- Byte order: Intel or Motorola (explained next).
- Signed or unsigned: whether the value can be negative (in Customizable CAN, the Value type field).
- Factor and offset: how to convert the transmitted integer into the physical value.
#Raw value and physical value
What travels on the network is always an integer, the raw value. The physical value (rpm, °C, bar, %) comes from a simple calculation:
physical value = raw value × factor + offset

The factor sets the resolution. A factor of 0.1 on a pressure in bar means each unit of the raw value is worth 0.1 bar. The offset shifts the range. Temperature with an offset of −40 lets you transmit from −40 °C upward using only positive numbers. To transmit, the calculation is the inverse: raw value = (physical value − offset) ÷ factor.
#Byte order: Intel and Motorola
When a signal occupies more than one byte, you need to know which byte comes first.
- Intel (little-endian): the least significant byte comes first. In the DBC it appears as @1.
- Motorola (big-endian): the most significant byte comes first. In the DBC it appears as @0.
The start bit also changes meaning. In the convention used by DBC files, in Intel the start bit is the least significant bit of the signal; in Motorola it is the most significant bit, and the counting goes byte by byte.

Getting the byte order wrong does not cause an error: it gives a nonsensical number. A 16-bit signal with the bytes swapped turns 1,000 rpm into 59,395 rpm. If the value read jumps strangely or becomes huge, the first suspect is the byte order.
#Signed signals (negative values)
Values that can be negative, such as ignition advance, fuel correction or lateral acceleration, are usually transmitted in two's complement, the standard way to write negative numbers in binary: the upper half of the range of raw values counts as negative. In an 8-bit signed signal, raw values 0 to 127 are worth 0 to 127 and 128 to 255 are worth −128 to −1; raw value 255 (0xFF) means −1. If the signal is configured as unsigned, the same data appears as 255. In the DBC, the + sign indicates unsigned and − indicates signed.