All developer tools

GATT Characteristic Value Decoder

Decode adopted GATT characteristic values into typed fields, flags, measurements, timestamps, and units with byte-level context.

0x2A37

Heart rate, sensor contact, energy expended, and one or more RR intervals.

Hexadecimal bytes
Example payload: 72 bpm with energy and RR interval

Decoded value

Heart Rate Measurement

0x2A37

Flags

+0

uint8 heart rate · sensor contact detected · energy present · RR intervals present

0x1E

1E

Heart rate

+1

72 bpm

uint8

48

Energy expended

+2

123 kJ

Accumulated since the last reset

7B 00

RR interval 1

+4

833.01 ms

853/1024 second · 72 bpm equivalent

55 03

Raw value

6 bytes

1E 48 7B 00 55 03

Bring decoded GATT data into your application

Read characteristics and subscribe to notifications through one consistent API across supported platforms.

Open the GATT tutorial
Workflow

Prepare characteristic value bytes

Select the characteristic whose value was read or received, then paste the value bytes in transmission order. An ATT opcode, attribute handle, notification header, or log timestamp is not part of the characteristic value and should be removed before decoding.

The decoder accepts compact or separated hexadecimal input, including1648, 16 48, 16:48, and C-style byte lists. Each decoded field retains its byte offset and source bytes, making the result easy to compare with a trace or firmware buffer.

Supported profiles

Supported adopted characteristics

The decoder supports adopted characteristics with stable, well-defined layouts. Each selection applies the characteristic's specified field order, flags, numeric representation, and units.

Battery Level0x2A19Battery charge as an unsigned percentage from 0 to 100.
Heart Rate Measurement0x2A37Heart rate, sensor contact, energy expended, and one or more RR intervals.
Temperature Measurement0x2A1CIEEE-11073 temperature with optional measurement time and body location.
Blood Pressure Measurement0x2A35Systolic, diastolic, and mean arterial pressure with optional record data.
Glucose Measurement0x2A18Sequenced glucose record with time, concentration, sample type, and status.
Current Time0x2A2BLocal date and time, day of week, fractional seconds, and adjustment reason.
Device Name0x2A00The GAP device name encoded as UTF-8 text.
Manufacturer Name String0x2A29The Device Information manufacturer name encoded as UTF-8 text.

For any other characteristic, preserve the raw value and use the defining profile or vendor protocol. Similar byte lengths do not imply compatible field layouts.

Encoding

Flags and little-endian values determine the layout

Multi-byte numeric fields in the covered Bluetooth services are transmitted least-significant byte first. For example, the bytes48 00 represent the unsigned 16-bit value 72. A trace viewer may display the same value as 0x0048, which reverses the visual byte order but not the data.

Measurement characteristics often begin with flags. Those bits select the width of the mandatory value and indicate which optional fields follow. The Heart Rate Measurement flags can add energy and a variable list of RR intervals; the blood pressure, temperature, and glucose flags similarly change the required length. A truncated optional field is a malformed value, not a partial measurement.

Numeric formats

Interpret IEEE-11073 values and units

Temperature Measurement uses the 32-bit IEEE-11073 FLOAT format. Blood pressure, pulse rate, and glucose concentration use the 16-bit SFLOAT format. These are decimal floating-point encodings: a signed mantissa is multiplied by ten raised to a signed exponent.

Both formats also reserve bit patterns for NaN, infinity, unavailable resolution, and reserved values. The decoder reports those states explicitly instead of turning them into ordinary numbers. Always retain the unit selected by the characteristic flags—especially for blood pressure and glucose, where the same bytes can represent different units.

Validation

Interpret validation results

Missing bytes stop the decode because the selected field layout cannot be completed safely. Reserved flag bits, impossible calendar fields, out-of-range battery percentages, and extra trailing bytes produce warnings while preserving every field that can still be interpreted.

Validate the characteristic UUID and the raw value at the same point in the trace. A notification from the wrong handle can be structurally valid under another layout and still produce a plausible, incorrect result. Use the GATT UUID lookup to identify adopted and common vendor UUIDs before interpreting their values.

References

Reference the adopted specifications

UUID assignments and common characteristic field definitions are maintained in the Bluetooth SIG's Assigned Numbers and GATT Specification Supplement. Profile-specific rules come from the adopted Battery, Heart Rate, Health Thermometer, Blood Pressure, Glucose, and Current Time service specifications.

Once the value is understood, reproduce the read or subscription with SimpleBLE and compare the callback bytes directly. For payloads obtained during discovery rather than after a connection, use the BLE advertisement decoder first.