BLE advertisement decoder
Paste a raw Bluetooth Low Energy advertising payload in hex and this page breaks it into its AD structures — naming each type, decoding the fields, and fixing the byte order that trips most people up. It runs on our server and nothing is stored.
19 bytes · 3 structures
-
0x01 Flags
06- Flags
- LE General Discoverable Mode, BR/EDR Not Supported
-
0x03 Complete List of 16-bit Service Class UUIDs
0D 18- UUID
- 0x180D — Heart Rate
-
0x09 Complete Local Name
48 65 61 72 74 20 52 61 74 65- Name
- Heart Rate
How advertising data is structured
A BLE advertising payload is not a fixed record. It is a sequence of self-describing chunks, each laid out the same way:
[length][AD type][data …]
The length
byte counts the AD type byte plus
the data bytes — not
the length byte itself. So 02 01 06
means "two bytes follow: type 0x01
(Flags) with one byte of data, 0x06". Chunks sit back to
back with no separator, and a decoder walks them by hopping forward length + 1
bytes at a time.
A legacy advertising packet carries at most 31 bytes of this data. Anything unused is commonly zero-padded, which is why a zero length byte is treated as the end of the real content rather than a malformed structure.
The byte-order trap
This is the single most common source of confusion. Multi-byte values in advertising data are little-endian — least significant byte first — but they are almost always written big-endian in documentation and specifications.
So the Battery service, UUID 0x180F, appears on the air as 0F 18. Apple's company identifier
0x004C
appears as 4C 00. A 128-bit UUID is fully reversed: the Nordic UART service
6e400001-b5a3-f393-e0a9-e50e24dcca9e
is transmitted as 9E CA DC 24 … 40 6E. If a UUID you look up returns nothing, try reversing the
bytes before assuming the device is doing something unusual.
Reference: AD types
These are the assigned AD types this decoder recognizes. A type outside the list is still shown, with its data as raw bytes. Type and service names follow the Bluetooth SIG assigned numbers and are used here only to identify what a payload contains.
| Type | Name |
|---|---|
0x01 |
Flags |
0x02 |
Incomplete List of 16-bit Service Class UUIDs |
0x03 |
Complete List of 16-bit Service Class UUIDs |
0x04 |
Incomplete List of 32-bit Service Class UUIDs |
0x05 |
Complete List of 32-bit Service Class UUIDs |
0x06 |
Incomplete List of 128-bit Service Class UUIDs |
0x07 |
Complete List of 128-bit Service Class UUIDs |
0x08 |
Shortened Local Name |
0x09 |
Complete Local Name |
0x0A |
Tx Power Level |
0x0D |
Class of Device |
0x10 |
Device ID / Security Manager TK Value |
0x11 |
Security Manager Out of Band Flags |
0x12 |
Peripheral Connection Interval Range |
0x14 |
List of 16-bit Service Solicitation UUIDs |
0x15 |
List of 128-bit Service Solicitation UUIDs |
0x16 |
Service Data - 16-bit UUID |
0x17 |
Public Target Address |
0x18 |
Random Target Address |
0x19 |
Appearance |
0x1A |
Advertising Interval |
0x1B |
LE Bluetooth Device Address |
0x1C |
LE Role |
0x1F |
List of 32-bit Service Solicitation UUIDs |
0x20 |
Service Data - 32-bit UUID |
0x21 |
Service Data - 128-bit UUID |
0x24 |
URI |
0x25 |
Indoor Positioning |
0x26 |
Transport Discovery Data |
0x27 |
LE Supported Features |
0x28 |
Channel Map Update Indication |
0x29 |
PB-ADV |
0x2A |
Mesh Message |
0x2B |
Mesh Beacon |
0x2C |
BIGInfo |
0x2D |
Broadcast_Code |
0x2E |
Resolvable Set Identifier |
0x2F |
Advertising Interval - long |
0x30 |
Broadcast_Name |
0x31 |
Encrypted Advertising Data |
0x34 |
Electronic Shelf Label |
0x3D |
3D Information Data |
0xFF |
Manufacturer Specific Data |
Where to get a payload to decode
Any scanner that shows you raw advertising bytes will do. On Android, BLE Sniffer logs the advertisements it sees and exports them, so you can paste real captures here. For the background on what you are looking at, see how BLE advertising works — it walks a payload byte by byte — and what a BLE sniffer is for how advertisement scanning differs from connection capture.