Hex(十六进制编码)¶
什么是16进制编码?¶
16 进制编码就是用十六进制(0–9 + A–F) 来表示数据的一种方式。CTF 中经常会利用 Hex 来隐藏字符串、Payload、Shellcode 或文件内容。
16 进制编码的基本原理¶
文本转16进制的原理是首先将文本中的每个字符根据其在特定字符集(如ASCII码、Unicode等)中的编码转换为二进制,然后将二进制数转换成十六进制数。具体来说,一个字符在计算机中通常占用一个或多个字节(例如,英文字符占一个字节,汉字通常占两个或更多字节),然后将这些字节的二进制值按顺序转换为十六进制表示形式。
16进制与ASCII¶
ASCII 是一种字符编码方式,每个字符用 1 个字节(8 bit) 表示。
例如:
- 字符 A ⇒ ASCII 十进制 65
- 二进制:
01000001
一个字节 = 8 bit = 恰好可以用两个十六进制数字表示
因为:
- 一个十六进制数字 = 4 bit
- 所以 两个十六进制数字 = 8 bit = 1 字节
即:
举例:
| ASCII 字符 | ASCII 十进制 | 二进制 | 16 进制 |
|---|---|---|---|
| A | 65 | 01000001 | 41 |
| B | 66 | 01000010 | 42 |
| a | 97 | 01100001 | 61 |
| 0 | 48 | 00110000 | 30 |
| 空格 | 32 | 00100000 | 20 |
所以 Hex 和 ASCII 的关系可以这样理解:
Hex 是 ASCII 字节的十六进制表示方式。
例子¶
16进制转换10进制¶
16进制到10进制的转换,其实和2进制到10进制的转换方式一致,都是按位的权值展开。
在2进制的情况下,位权值是2的幂次,16进制的情况下,就是16的幂次,从右往左依次排列如下:
\[
16^0, 16^1, 16^2, \ldots, 16^{15},\quad \text{其中 } A=10, B=11, \ldots, F=15
\]
例如:66(f)和6c(l)
\[
\begin{aligned}
66 &= 6 \times 16^1 + 6 \times 16^0 \\
&= 6 \times 16 + 6 \\
&= 96 + 6 \\
&= 102
\end{aligned}
\]
\[
\begin{aligned}
6c &= 6 \times 16^1 + 12 \times 16^0 \\
&= 6 \times 16 + 12 \\
&= 96 + 12 \\
&= 108
\end{aligned}
\]
字符串:"CTF"¶
ASCII 字节为:
十六进制写成:
也就是:
字符串:"Hello"¶
ASCII → Hex:
| H | e | l | l | o |
|---|---|---|---|---|
| 48 | 65 | 6C | 6C | 6F |