Free hex converter and value inspector
Hex to decimal, and everything else those bytes mean
Paste a hexadecimal value — prefixed with 0x, with #, or bare — and its decimal, binary and octal forms appear at once, free and with nothing to sign up for. The arithmetic runs on BigInt rather than parseInt, so 0x1FFFFFFFFFFFFFFF comes back as 2,305,843,009,213,693,951 instead of the 2,305,843,009,213,694,000 a 64-bit float rounds it to, and there is no ceiling on how many digits you paste. Give it a single value and you also get the byte breakdown, the signed reading at 8, 16, 32 and 64 bits, and what those bytes would mean as a colour, an IPv4 address, a Unix timestamp, ASCII text or an IEEE-754 float; give it a column of up to 1,000 lines and you get a row for each.
- 100% free
- No signup
- Exact past 2^53
- 0x, # or bare digits
- Up to 1,000 lines
0x, #, U+, \x and a trailing h are all stripped. Spaces, underscores and commas inside a value are treated as digit separators, so a dump line pastes in whole.
Byte breakdownmost significant first · byte-swapped it reads 0xEFBEADDE (4,022,250,974), which is what a little-endian dump of 4 bytes shows
| Byte | Hex | Decimal | Binary | ASCII |
|---|---|---|---|---|
| 0 | DE | 222 | 11011110 | · |
| 1 | AD | 173 | 10101101 | · |
| 2 | BE | 190 | 10111110 | · |
| 3 | EF | 239 | 11101111 | · |
Read at a fixed widththe same bits, signed and unsigned
| Width | Stored bits | Unsigned | Signed (two's complement) |
|---|---|---|---|
| 32-bit | 0xDEADBEEF | 3,735,928,559 | -559,038,737 |
| 64-bit | 0x00000000DEADBEEF | 3,735,928,559 | 3,735,928,559 |
Every row holds the same bits; only the agreement about the top bit changes what they are worth.
What else these bytes could be
As a colour
#DEADBEEF · rgb(222, 173, 190) · alpha 0.94CSS reads eight digits as #RRGGBBAA; Android and .NET read the same eight as AARRGGBB.
As an IPv4 address
222.173.190.239Four bytes in network order — the form a packet capture or a routing table stores.
As a Unix timestamp (seconds)
2088-05-20 21:55:59 UTCSeconds since 1970-01-01. A 32-bit signed counter runs out at 0x7FFFFFFF, 2038-01-19.
As an IEEE-754 binary32 float
-62598533987077980001 sign bit, 8 exponent bits, 23 fraction bits — the layout of a C float.
How to convert hex to decimal
One value or a whole column, with the bytes behind the number.
Drop the value in, prefix and all
Type or paste the hex. A leading 0x, #, U+, \x or 16# is stripped for you, a trailing h from assembly listings goes too, and spaces, underscores and commas inside the value are read as digit separators — so a dump line such as DE AD BE EF arrives as one 32-bit value rather than four failures. Press the paste shortcut with the cursor anywhere on the page to load whatever is on the clipboard.
Read the four bases, then the bytes
Decimal, hex, binary in groups of four and octal appear together, each with its own copy button, and the header tells you how many bits the value occupies. Underneath, the byte table gives every byte its offset, its decimal value, its eight bits and its ASCII character, and names the byte-swapped value so a little-endian dump stops being a puzzle.
Check the width table and the alternative readings
The fixed-width table shows the same bits as an unsigned number and as a two's-complement signed one at 8, 16, 32 and 64 bits, which is the difference between 4294967294 and −2. Below it, only the readings the digit count can support are offered: a colour swatch for 3, 4, 6 or 8 digits, a dotted IPv4 quad for 8, a UTC date when the number lands in timestamp range, the text when every byte is printable, and the IEEE-754 float when you have a full 32 or 64 bits. Paste several lines instead of one and the page switches to a table with a row per value.
Technical specifications
| Accepted input | 0x1F4A, #ff8800, 1Fh, \x41, U+1F600, 16#1F# and bare digits; spaces, underscores and commas inside a value count as separators, and a leading minus makes it negative |
|---|---|
| Output | Decimal with thousands separators, binary grouped in fours, octal, and the hex echoed back in upper case — each with its own copy button |
| Precision | BigInt end to end: 0x1FFFFFFFFFFFFFFF gives 2,305,843,009,213,693,951, where parseInt returns 2,305,843,009,213,694,000 |
| Largest value | No ceiling — 4,096 hex digits (16,384 bits, 4,932 decimal digits) convert in about 0.1 ms |
| Column mode | One value per line, up to 1,000 lines; 1,000 rows convert in roughly 0.1 ms and copy out as tab-separated text |
| Fixed-width readings | Unsigned and two's-complement signed values at 8, 16, 32 and 64 bits, plus the byte-swapped little-endian value for inputs of 2, 4 or 8 bytes |
| Alternative readings | CSS colour at 3, 4, 6 or 8 digits; IPv4 at 8; Unix seconds and milliseconds when in range; printable ASCII or valid UTF-8; IEEE-754 binary32 at 8 digits and binary64 at 16 |
| Processing location | Your browser — nothing you paste is uploaded, and the page works offline once loaded |
Frequently asked questions
How do I convert hex to decimal by hand?
Multiply each digit by 16 raised to its position, counting from zero on the right, and add the results. For 0x2F3 that is 2×256 + 15×16 + 3×1 = 512 + 240 + 3 = 755. The digits above 9 are the only thing to memorise — A is 10, B 11, C 12, D 13, E 14, F 15 — and the doubling trick helps for round values: 0x100 is 256, 0x1000 is 4096, and each extra zero multiplies by 16.
Why does a long hex value come back wrong in other converters?
Because they hand it to parseInt or Number, and both produce a 64-bit float that cannot represent integers above 9,007,199,254,740,991 exactly. parseInt("1FFFFFFFFFFFFFFF", 16) answers 2305843009213694000 when the true value is 2305843009213693951 — quietly 49 too high — and Number("0x20000000000001") loses its last digit the same way. This page never converts to a float: the digits go straight into a BigInt, which has no ceiling, so a 64-bit register value, a Snowflake ID or a 512-bit hash all come out digit for digit.
Why is 0.1 + 0.2 not 0.3, in hex terms?
Because in binary those numbers are not what they look like, and hex shows it immediately. Written as a raw IEEE-754 double, 0.1 is 3FB999999999999A and 0.2 is 3FC999999999999A — both ending in A, both rounded up from a repeating fraction, because a tenth is no more expressible in base 2 than a third is in base 10. Add them and you get 3FD3333333333334, while the double closest to 0.3 is 3FD3333333333333: the two differ by one unit in the last place, which prints as 0.30000000000000004. Paste either of those 16-digit values into this page and the IEEE-754 reading will hand you back the number it stands for.
What does the 0x prefix mean, and do I have to type it?
It is a marker inherited from C that tells a compiler the digits after it are base 16, and it is not part of the number — 0x1F and 1F are the same 31. You never have to type it here, and five other conventions are accepted as well: # for CSS colours, U+ for Unicode code points, \x inside string escapes, a trailing h from assembly listings, and &#x…; from HTML entities. Different ecosystems settled on different markers because bare digits are ambiguous: 10 is ten in decimal and sixteen in hex, and only the prefix tells you which was meant.
How do I read a negative hex value like 0xFFFFFFFE?
You cannot, until you know how wide the register is — the same bits mean 4,294,967,294 as an unsigned 32-bit value and −2 as a signed one. Two's complement is the agreement that makes the second reading work: the top bit carries a negative weight, so in 32 bits the pattern is worth −2³¹ + the rest. That is why the width table on this page lists each width separately instead of picking one for you, and why a value that looks absurdly large in a debugger is usually a small negative number read at the wrong width. Typing a minus sign in front of a hex value here works too, and the table shows which register the result would fit in.
What is 0xDEADBEEF, and why do hex values spell words?
It is a magic number — a value chosen to be recognisable when it turns up somewhere it should not. Because hex uses the letters A to F you can spell a limited vocabulary with it, and programmers have used that for decades: 0xDEADBEEF marks freed or uninitialised memory on several platforms, 0xCAFEBABE is the first four bytes of every Java .class file, 0xFEEDFACE identifies a 32-bit Mach-O binary on macOS, and 0x8BADF00D is the code iOS records when the watchdog kills an app for taking too long to launch. Spotting one in a hex dump usually means you are reading memory that was never initialised with real data.
Can I convert a whole column of hex values at once?
Yes — paste one value per line and the page switches from the single-value inspector to a table with decimal, hex and binary for each row. Up to 1,000 lines are read at a time, a thousand rows convert in about a tenth of a millisecond, and the whole table copies as tab-separated text that pastes straight back into a spreadsheet. Lines that are not valid hex keep their place in the table with the reason beside them, so a bad row never silently shifts everything below it.
About hexadecimal
Hexadecimal survives for one reason: 16 is 2⁴, so a hex digit is exactly four bits and a byte is exactly two digits, with no remainder and no carry across the boundary. Change one hex digit and you have changed one nibble and nothing else — which is why memory dumps, MAC addresses, colour codes, UUIDs and SHA hashes are all written this way. Decimal has no such alignment: a decimal digit carries log₂10 ≈ 3.32 bits, so decimal digit boundaries fall in the middle of bytes and a single-digit edit can ripple through the whole value. Octal, which groups by three bits, aligned neatly with the 12, 24 and 36-bit machines of the 1960s; when hardware settled on multiples of 8, hex won and octal was left behind in Unix file permissions.
The one thing a hex converter has to get right is exactness, and it is where most of them fail. JavaScript's parseInt and Number both go through a double, which stores 53 bits of significand, so any value above 9,007,199,254,740,991 is rounded to the nearest representable neighbour without a word of warning: 0x1FFFFFFFFFFFFFFF comes back 49 too large. That is not an edge case in practice — a 64-bit register value, a Discord or Twitter snowflake ID, a hash prefix and an inode number all live above the line. Everything on this page is BigInt arithmetic, and every digit you paste is a digit you get back. The same trap is worth knowing about in JSON, where a large integer is a number literal that JSON.parse rounds, and in binary conversion, where a double runs out of exact integers as soon as the value reaches its fourteenth hex digit.
Bytes do not know what they are. The same 32 bits are 3,735,928,559, the colour #DEADBE with an EF alpha channel, the address 222.173.190.239, a date in 2088 and a float of about −6.26×10¹⁸, and only context decides which reading is the true one. That ambiguity is exactly why an inspector beats a bare converter: when a debugger shows you C0A80101 you want to be told it is 192.168.1.1 before you work out that it is also 3,232,235,777. It is also where the famous deadlines come from — 0x7FFFFFFF, the largest signed 32-bit integer, is 03:14:07 UTC on 19 January 2038, the moment a 32-bit Unix timestamp wraps into the negative and starts counting from 1901.
Where your values are converted
Conversion happens in this tab and nowhere else. The digits you paste are parsed by JavaScript that arrived with the page, never posted to a server and never stored, which matters more than it sounds: hex values pasted into a converter are often session tokens, key material or memory contents from a crash. Close the tab and there is nothing left to find.