
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.
Decoded value
Heart Rate Measurement
Flags
+0uint8 heart rate · sensor contact detected · energy present · RR intervals present
0x1E
1E
Heart rate
+172 bpm
uint8
48
Energy expended
+2123 kJ
Accumulated since the last reset
7B 00
RR interval 1
+4833.01 ms
853/1024 second · 72 bpm equivalent
55 03
Raw value
6 bytes1E 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.
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 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.
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.
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.
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.
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.
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.