Chuyển đổi IP sang thập phân
Chuyển một địa chỉ IP sang thập phân, hex, nhị phân và bát phân, hoặc nhập bất kỳ số nào trong số đó để lấy lại IP. Mỗi octet được vẽ thành 8 bit kèm trọng số, để bạn theo dõi được phép tính.
Đọc theo dạng thập phân có dấu chấm
| Octet | 1286432168421 | Hex |
|---|---|---|
| 198 | 11000110 | C6 |
| 128+64+4+2 × 256³ = 3 321 888 768 | ||
| 51 | 00110011 | 33 |
| 32+16+2+1 × 256² = 3 342 336 | ||
| 100 | 01100100 | 64 |
| 64+32+4 × 256 = 25 600 | ||
| 77 | 01001101 | 4D |
| 64+8+4+1 × 1 = 77 | ||
| Tổng | ||
| = 3 325 256 781 | ||
Một địa chỉ IP, hoặc số thập phân, hex, nhị phân hay bát phân của nó để lấy lại IP. Chuyển đổi ngay trong trình duyệt của bạn; không gửi gì đi.
3325256781
Cùng số đó trong code
SELECT INET_ATON('198.51.100.77');3325256781SELECT '198.51.100.77'::inet - '0.0.0.0'::inet;3325256781int(ipaddress.ip_address('198.51.100.77'))3325256781ip2long('198.51.100.77')3325256781- Thập phân có dấu chấm
- Thập phân
- Hex
- Octet nhị phân
- Bát phân
- Octet hex
- Octet bát phân
- Trong trình duyệt (mỗi URL đều mở 198.51.100.77)
- Tên DNS ngược
- Dạng IPv6 (ánh xạ)
- IPv4 → IPv6
Làm sao chuyển địa chỉ IP sang thập phân?
Nhân bốn số lần lượt với 256³, 256², 256 và 1 rồi cộng lại: 192.168.1.1 là 192 × 16777216 + 168 × 65536 + 1 × 256 + 1 = 3232235777.
Một địa chỉ IPv4 là một số 32 bit được viết thành bốn mảnh 8 bit, nên dạng có dấu chấm và dạng thập phân là cùng một giá trị. Tài liệu của MySQL lấy ví dụ 10.0.5.9 = 167773449.

Nhập dạng nào cũng đượcCó dấu chấm, thập phân, hex, nhị phân, bát phân hay URL: ô nhập đọc được tất cả.Bit và trọng sốMỗi bit 1 cộng thêm trọng số của nó: 128 + 64 + 4 + 2 = 198.× 256³, 256², 256, 1Mỗi octet nhân với trọng số của nó, rồi cộng tổng.Ra đủ mọi dạngHex, nhị phân, bát phân và các URL mà trình duyệt chấp nhận, mỗi dạng đều có nút sao chép.Con sốCả địa chỉ dưới dạng một số 32 bit, sẵn sàng sao chép, kèm loại địa chỉ.Làm sao chuyển số thập phân sang địa chỉ IP?
Chia cho 16777216, rồi chia số dư cho 65536, rồi cho 256: ba thương và số dư cuối cùng là bốn số, nên 3232235777 là 192.168.1.1.
Nhập con số vào công cụ và nó làm đúng như vậy, kèm cả hex, nhị phân, bát phân và các dạng trình duyệt chấp nhận. Số lớn hơn 4294967295 không phải địa chỉ IPv4; công cụ đọc chúng là số IPv6 và nói rõ điều đó.
3 232 235 777÷ 16 777 216=192dư 11 010 30511 010 305÷ 65 536=168dư 257257÷ 256=1dư 11÷ 1=1dư 0192.168.1.1
Làm sao chuyển địa chỉ IP sang nhị phân?
Viết mỗi số trong bốn số thành 8 bit với các trọng số 128, 64, 32, 16, 8, 4, 2 và 1: 192 là 128 + 64, nên là 11000000, và 192.168.1.1 là 11000000.10101000.00000001.00000001.
Đi qua các trọng số từ trái sang: viết 1 và trừ đi khi trọng số còn vừa, nếu không thì viết 0. Với 168: 128 vừa (còn 40), 64 không vừa, 32 vừa (còn 8), 16 không vừa, 8 vừa, nên là 10101000. Để đổi ngược từ nhị phân, cộng trọng số của các bit 1.
| 128 | 64 | 32 | 16 | 8 | 4 | 2 | 1 | ||
|---|---|---|---|---|---|---|---|---|---|
| 192 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 128 + 64 |
| 168 | 1 | 0 | 1 | 0 | 1 | 0 | 0 | 0 | 128 + 32 + 8 |
| 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 |
| 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 |
11000000.
Làm sao chuyển địa chỉ IP sang hex?
Chia 8 bit của mỗi octet thành hai nửa 4 bit và viết mỗi nửa thành một chữ số hex: 192 là 1100 0000, tức C0, nên 192.168.1.1 là 0xC0A80101.
Hex cũng là cách IPv6 viết một địa chỉ IPv4 được nhúng: ::ffff:c0a8:101 là 192.168.1.1. Trình duyệt chấp nhận số hex làm host: http://0xC0A80101/ mở 192.168.1.1.
11000000C010101000A8000000010100000001010xC0A80101
4 bit = 1 chữ số hex
Vì sao http://3232235777 mở 192.168.1.1?
Vì trình duyệt đọc một host chỉ gồm chữ số thành địa chỉ IPv4 theo bất kỳ dạng inet_aton cũ nào, kể cả một số thập phân duy nhất, rồi tải địa chỉ có dấu chấm.
Mỗi phần có thể là thập phân (URL Standard), hex với 0x hoặc bát phân với số 0 đứng đầu, và khi có ít hơn bốn phần thì phần cuối lấp đầy các byte còn lại. Vì vậy http://192.168.1/ mở 192.168.0.1, không phải 192.168.1.1. ping và curl cũng chấp nhận các dạng này.
Số vượt quá 32 bit, chữ số 8 hoặc 9 trong một phần bắt đầu bằng 0, và phần thứ năm đều bị từ chối.
| Gõ vào thanh địa chỉ | Mở ra |
|---|---|
http://3232235777/ | 192.168.1.1 |
http://0xC0A80101/ | 192.168.1.1 |
http://0300.0250.1.1/ | 192.168.1.1 |
http://127.1/ | 127.0.0.1 |
http://192.168.1/ | 192.168.0.1 |
http://4294967296/ | Bị từ chối |
http://09/ | Bị từ chối |
http://192.0.2.1.5/ | Bị từ chối |
Vì sao các cách viết khác của địa chỉ IP quan trọng với bảo mật?
Vì một bộ lọc so sánh địa chỉ dưới dạng văn bản có thể bị đánh lừa: 2130706433, 0x7f.1, 127.1 và ::ffff:127.0.0.1 đều là 127.0.0.1, nên bộ lọc phải so sánh giá trị số, không phải chuỗi.
OWASP liệt kê các cách mã hóa này trong số những cách vượt qua lớp phòng thủ SSRF. Đã có thư viện phát hành kèm lỗi này: các gói npm netmask và ip, ipaddress của Python và gói net của Go đều từng đọc sai số 0 đứng đầu hoặc các dạng viết khác, và sau đó đã được sửa.
Hãy phân tích bằng một trình đọc nghiêm ngặt, chuyển sang số, rồi mới so sánh dải. Chặn cả các địa chỉ ánh xạ IPv4 của những dải bị chặn.
deny 127.0.0.1
So sánh dạng chuỗi
127.0.0.1bị chặn
2130706433lọt qua
0x7f.1lọt qua
127.1lọt qua
::ffff:127.0.0.1lọt qua
So sánh dạng số
127.0.0.12130706433 · bị chặn
21307064332130706433 · bị chặn
0x7f.12130706433 · bị chặn
127.12130706433 · bị chặn
::ffff:127.0.0.12130706433 · bị chặn
Làm sao chuyển địa chỉ IPv6 sang thập phân?
Làm tương tự với tám nhóm 16 bit: 2001:db8::1 là 42540766411282592856903984951653826561, một số dài tới 39 chữ số cần đến BigInt trong JavaScript.
Có 2^128 địa chỉ IPv6. Số trong JavaScript chỉ lưu chính xác số nguyên tới 2^53 − 1, nên phép tính thông thường âm thầm làm tròn các giá trị IPv6. int(ipaddress.ip_address(…)) của Python thì chính xác.
2001:db8::1
42540766411282592856903984951653826561
chính xác (BigInt)
42540766411282592856903984951653826560
Number(): bị làm tròn sau 2^53
Làm sao chuyển địa chỉ IP sang số trong code và cơ sở dữ liệu?
Dùng hàm có sẵn của nền tảng với kiểu không dấu: INET_ATON() của MySQL vào INT UNSIGNED, phép trừ inet của PostgreSQL, int(ipaddress.ip_address(…)) của Python, và >>> 0 sau các phép dịch bit trong JavaScript.
Số nguyên 32 bit có dấu không chứa được các địa chỉ từ 128.0.0.0 trở lên: << của JavaScript cho ra -1062731519 với 192.168.1.1, và ip2long() của PHP ra số âm trên bản build 32 bit. Với IPv6, MySQL dùng INET6_ATON() và VARBINARY(16).
› SELECT INET_ATON('192.168.1.1'), INET_NTOA(3232235777); 3232235777 | 192.168.1.1
MySQL 8.4
› SELECT '192.168.1.1'::inet - '0.0.0.0'::inet, '0.0.0.0'::inet + 3232235777; 3232235777 | 192.168.1.1
PostgreSQL 16
› import ipaddress int(ipaddress.ip_address('192.168.1.1')), ipaddress.IPv4Address(3232235777) (3232235777, IPv4Address('192.168.1.1'))
Python ipaddress
› '192.168.1.1'.split('.').reduce((n, o) => (n << 8) | +o, 0) >>> 0 3232235777
JavaScript
› echo ip2long('192.168.1.1'), ' ', long2ip(3232235777); 3232235777 192.168.1.1
PHP 8
Câu hỏi thường gặp
192.168.1.1 ở dạng thập phân là bao nhiêu?
Giá trị thập phân lớn nhất của một địa chỉ IPv4 là bao nhiêu?
Làm sao chuyển 3232235777 trở lại địa chỉ IP?
Số 0 đứng đầu như 010 trong địa chỉ IP có nghĩa là gì?
Vì sao 192.168.1 mở 192.168.0.1?
Làm sao tự tay chuyển địa chỉ IP sang nhị phân?
Làm sao lưu địa chỉ IP dưới dạng số trong MySQL?
Vì sao số IP của tôi bị âm trong JavaScript hoặc PHP?
Có thể chuyển địa chỉ IPv6 sang thập phân không?
http://0x7f000001/ có giống 127.0.0.1 không?
Công cụ liên quan
IPv6 Sang IPv4
Tìm địa chỉ IPv4 trong một địa chỉ IPv6: ánh xạ, NAT64, 6to4, Teredo và ISATAP, từng bit một
IPv4 Sang IPv6
Mọi dạng IPv6 của một địa chỉ IPv4: ánh xạ, NAT64 và 6to4, kèm dạng nào đang dùng hay hiếm gặp
Nén IPv6
Nén hoặc mở rộng địa chỉ IPv6 theo RFC 5952 và xem quy tắc nào đã bỏ từng số 0
IP Của Tôi Là Gì
IPv4 và IPv6 công cộng của bạn cùng lúc, kèm mạng, vị trí và kiểm tra VPN
Kiểm tra IPv6
Kiểm tra IPv6 có hoạt động, trình duyệt chọn họ nào và website có IPv6 không
Máy Tính Subnet
Địa chỉ mạng, broadcast, số host dùng được và mask cho mọi khối IPv4 hoặc IPv6, kèm VLSM, chia subnet và subnet trên cloud
Tra Cứu DNS Ngược
Tìm hostname liên kết với bất kỳ địa chỉ IP nào qua bản ghi PTR
Tra Cứu DNS
Mọi bản ghi DNS từ máy chủ của chính tên miền, cạnh bộ nhớ đệm của Google và Cloudflare