# Hexdump & Byte Stream Parser

> Show the exact bytes of any text as an offset / hex / ASCII dump, like xxd or hexdump -C.

- Page: https://decoder.tools/hexdump-parser
- Category: Data, Radix & String
- Status: live, runs in the browser
- Last reviewed: 2026-10-23

A hexdump shows data byte by byte: an offset on the left, the bytes in hex in the middle, and the printable ASCII characters on the right. This viewer encodes the text you paste as UTF-8 and dumps those bytes.

## Example

```text Input
Hello, world
```

```text Output
00000000  48 65 6c 6c 6f 2c 20 77 6f 72 6c 64              |Hello, world|
```

Each row holds 16 bytes. Bytes outside printable ASCII appear as `·` in the right-hand column.

## Why look at the bytes?

Text that looks identical on screen can be different underneath. A hexdump settles questions like these:

- **Invisible characters.** A zero-width space shows up as `e2 80 8b`, a non-breaking space as `c2 a0`, and a byte order mark as `ef bb bf` at offset 0.
- **Line endings.** Unix uses `0a`, Windows uses `0d 0a`. A stray `0d` is a common reason scripts fail with "bad interpreter".
- **Encoding problems.** `é` in UTF-8 is `c3 a9`. If you see `c3 83 c2 a9`, the text was converted to UTF-8 twice (mojibake).
- **Look-alike characters.** A Cyrillic `а` (`d0 b0`) looks just like a Latin `a` (`61`) but makes passwords, domains and code fail.

This viewer works on text you paste. To turn hex back into text, use the [Hex to text converter](/hex-decoder).

## How to use the hexdump viewer

1. Paste or type the text you want to inspect.
2. Read the dump. The offset column counts bytes in hex, so `00000010` is byte 16.
3. Compare the byte count with the visible character count. A mismatch means multi-byte or invisible characters.

## Make a hexdump on the command line

```sh Command line
printf 'Hello, world' | xxd
printf 'Hello, world' | hexdump -C
```

```python Python
data = "Hello, world".encode("utf-8")
for i in range(0, len(data), 16):
    row = data[i:i + 16]
    print(f"{i:08x}  {row.hex(' '):<47}  |{''.join(chr(b) if 32 <= b < 127 else '.' for b in row)}|")
```

## Hexdump at a glance

| | |
|---|---|
| Layout | Offset, 16 bytes in hex, ASCII column |
| Input encoding | Text is encoded as UTF-8 before dumping |
| Non-printable bytes | Shown as `·` in the ASCII column |
| Equivalent tools | `xxd`, `hexdump -C`, `od -A x -t x1z` |

## FAQ

### Why are there more bytes than characters?

UTF-8 uses 1 byte for ASCII and 2 to 4 bytes for everything else. `é` takes 2 bytes, `€` takes 3 and most emoji take 4.

### How do I find a zero-width character in text?

Paste the text and look for `e2 80 8b` (zero-width space), `e2 80 8c` (zero-width non-joiner), `e2 80 8d` (zero-width joiner) or `ef bb bf` (BOM). The [Zero-width decoder](/zero-width-decoder) can also read messages hidden this way.

### Can I upload a file?

Not yet. This viewer dumps text you paste. For files, `xxd file.bin` or `hexdump -C file.bin` in a terminal give the same layout.
