Everything on this page follows from three facts:
Keep this conversion table next to you; it is the only lookup the whole procedure needs:
| Hex | Binary | Hex | Binary |
|---|---|---|---|
0 | 0000 | 8 | 1000 |
1 | 0001 | 9 | 1001 |
2 | 0010 | A | 1010 |
3 | 0011 | B | 1011 |
4 | 0100 | C | 1100 |
5 | 0101 | D | 1101 |
6 | 0110 | E | 1110 |
7 | 0111 | F | 1111 |
Take a real bitmap and walk it end to end:
7238400108C08000
The procedure:
1 is a present field.A shortcut that saves counting: hex character k covers bits 4(kโ1)+1 through 4k. Character 1 covers bits 1โ4, character 2 covers 5โ8, character 11 covers 41โ44, and so on. Here is the full walk:
| Char # | Hex | Binary | Bits covered | Fields set |
|---|---|---|---|---|
| 1 | 7 | 0111 | 1โ4 | 2, 3, 4 (bit 1 = 0 โ no secondary bitmap) |
| 2 | 2 | 0010 | 5โ8 | 7 |
| 3 | 3 | 0011 | 9โ12 | 11, 12 |
| 4 | 8 | 1000 | 13โ16 | 13 |
| 5 | 4 | 0100 | 17โ20 | 18 |
| 6 | 0 | 0000 | 21โ24 | โ |
| 7 | 0 | 0000 | 25โ28 | โ |
| 8 | 1 | 0001 | 29โ32 | 32 |
| 9 | 0 | 0000 | 33โ36 | โ |
| 10 | 8 | 1000 | 37โ40 | 37 |
| 11 | C | 1100 | 41โ44 | 41, 42 |
| 12 | 0 | 0000 | 45โ48 | โ |
| 13 | 8 | 1000 | 49โ52 | 49 |
| 14 | 0 | 0000 | 53โ56 | โ |
| 15 | 0 | 0000 | 57โ60 | โ |
| 16 | 0 | 0000 | 61โ64 | โ |
Result: fields 2, 3, 4, 7, 11, 12, 13, 18, 32, 37, 41, 42, 49 โ the shape of a typical authorization: PAN, processing code, amount, timestamp, STAN, times and dates, acquirer ID, RRN, terminal and merchant IDs, currency. What each of those numbers means is in the field quick reference; paste the same hex into the bitmap calculator and it draws all 64 bits so you can check your paper work bit by bit.
Two things to remember once the field list is in hand: the data elements follow in ascending field number order, and each element then has its own length rules (fixed, LLVAR, LLLVAR) โ that layer is covered in reading field format notation.
Going the other way is easier if you stop thinking in 64 bits and start thinking in 8 bytes of 8 fields each:
| Byte | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
|---|---|---|---|---|---|---|---|---|
| Owns fields | 1โ8 | 9โ16 | 17โ24 | 25โ32 | 33โ40 | 41โ48 | 49โ56 | 57โ64 |
For any field N: byte number = โN/8โ, and its position inside that byte = ((Nโ1) mod 8) + 1, counting from the left. Each position has a fixed hex weight โ the byte's value is just the sum of the weights of the fields you set:
| Position in byte | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
|---|---|---|---|---|---|---|---|---|
| Hex weight | 80 | 40 | 20 | 10 | 08 | 04 | 02 | 01 |
Worked example โ build the bitmap for fields 2, 3, 4, 11, 41:
| Byte | Owns fields | Present here | Bit pattern | Hex |
|---|---|---|---|---|
| 1 | 1โ8 | 2, 3, 4 | 01110000 | 70 (40+20+10) |
| 2 | 9โ16 | 11 โ position 3 | 00100000 | 20 |
| 3 | 17โ24 | โ | 00000000 | 00 |
| 4 | 25โ32 | โ | 00000000 | 00 |
| 5 | 33โ40 | โ | 00000000 | 00 |
| 6 | 41โ48 | 41 โ position 1 | 10000000 | 80 |
| 7 | 49โ56 | โ | 00000000 | 00 |
| 8 | 57โ64 | โ | 00000000 | 00 |
Read the hex column top to bottom:
7020000000800000
Spot-check the two non-obvious fields: field 11 โ byte โ11/8โ = 2, position (11โ1) mod 8 + 1 = 3, weight 20. Field 41 โ byte โ41/8โ = 6, position (41โ1) mod 8 + 1 = 1, weight 80. Type 2,3,4,11,41 into the calculator's fields box and the same hex comes back.
Bit 1 is not "DE1 is present". Bit 1 set means another 8-byte bitmap immediately follows the first one, and that second bitmap covers fields 65โ128. DE1 is the secondary bitmap โ it never appears as a data element in a parsed message, which is why no correct decoder ever lists "field 1" in its output.
Decoding the second bitmap uses exactly the same procedure, then add 64: position 1 of the secondary bitmap = field 65, position 6 = field 70, position 64 = field 128.
Here is the smallest real message that needs one โ a network echo test (0800), the same message dissected in real message examples:
8220000000000000 0400000000000000
| Piece | Hex | Binary | Meaning |
|---|---|---|---|
| Primary, char 1 | 8 | 1000 | Bit 1 set โ a secondary bitmap follows |
| Primary, char 2 | 2 | 0010 | Bit 7 โ DE7 (transmission date & time) |
| Primary, char 3 | 2 | 0010 | Bit 11 โ DE11 (STAN) |
| Secondary, byte 1 | 04 | 00000100 | Position 6 โ 64 + 6 = DE70 (network mgmt code) |
Fields present: 7, 11, 70. Because DE70 sits above 64, even this tiny three-field message must carry 16 bytes of bitmap. Open the full 0800 in the parser โ
Sixteen bytes of hex in front of you does not mean sixteen bytes of bitmap. The first bit decides. Take the opening of the 0100 authorization from the examples article โ bitmap plus the first 16 characters of data:
723C448028C08000 1640000012345678
The first character is 7 = 0111 โ bit 1 is clear, so the bitmap ends after 16 characters. What follows (16 then 4000001234โฆ) is DE2: an LLVAR length of 16 and the start of the PAN. Force those 16 characters through the bitmap procedure anyway and you "discover" fields 68, 70, 71, 74, 100, 103, 107, 108, 110, 114, 116, 118, 119, 122, 123, 124, 125 โ seventeen phantom fields that were never sent, and every real field after DE2 lands in the wrong place.
The warning sign is exactly that pattern: a scatter of high-numbered, rarely-used fields in an otherwise ordinary message. Paste the full 32 characters into the bitmap calculator and it flags it: bit 1 is 0, so the last 16 characters are not bitmap and get ignored.
The mirror image, on the build side. Say the message needs DE90 (original data elements, used in reversals) on top of fields 2, 3, 4, 11, 41. It is not enough to append a second bitmap with position 26 set โ bit 1 must come on too, which changes the very first byte:
| Bitmap | What a receiver does | |
|---|---|---|
| Correct | F020000000800000 0000004000000000 | First char F = 1111: bit 1 on โ reads 16 bytes, finds 2, 3, 4, 11, 41, 90 |
| Bit 1 forgotten | 7020000000800000 0000004000000000 | First char 7: bit 1 off โ reads only 8 bytes, then parses 0000004000โฆ as the start of DE2 โ every field from there on is garbage |
Note the first byte: 70 became F0 because the bit-1 weight (80) was added. The receiving side won't reject the broken version as "bad bitmap" โ it will fail later, deep inside the data, with a confusing length or format error. The calculator guards both directions: enter any field above 64 in the fields box and it sets bit 1 for you; paste a 16-character bitmap whose first character is 8 or higher and it warns that the secondary bitmap is missing.
0โ7 โ bit 1 clear โ exactly 16 characters. 8โF โ bit 1 set โ there must be 32. A first character of 8+ with only 16 characters available means the value is truncated.Fs usually mean the wrong starting offset, or hex that is really ASCII/BCD read with the wrong encoding โ the same bytes give completely different bitmaps under each. The parser scores encodings automatically, and the examples article has a checklist for messages that won't parse."7238โฆ"); in a binary message it is 8 raw bytes that only look like 16 characters once a hex viewer renders them. On paper both decode identically โ the difference matters when you count byte offsets into the raw message.ISO 8583 defines up to 128 data elements, but a typical message carries only 10โ20 of them. A fixed layout would force every message to reserve space for all 128 โ hundreds of wasted bytes per transaction, multiplied by billions of transactions. The bitmap spends 8 bytes (16 when fields above 64 are needed) to say "only these fields follow", so each message carries exactly what it needs, and a receiver can test "is DE55 present?" by checking a single bit before parsing anything. How the bitmap sits between the MTI and the data elements is laid out in how to read an ISO 8583 message.
๐ Prefer to see the bits drawn instead of drawing them? The bitmap calculator works both directions โ hex to fields and fields to hex โ and to watch a bitmap doing its job inside a full message, paste one of the real examples into the parser.