跳转至

格雷编码

什么是格雷编码?

格雷编码(Gray Code)是一种相邻数值之间只有 1 个二进制位不同的编码方式。它常用于旋转编码器、硬件电路、通信采样等场景。

CTF 中如果看到一组二进制数相邻项只变化一位,或者题目提示 Gray、格雷、反射二进制码,就可以考虑格雷编码。

格雷码特点

  • 相邻两个编码只有 1 bit 不同。
  • 可以减少状态切换时的误读。
  • 常见的是二进制反射格雷码(Binary Reflected Gray Code)。

例如 0 到 7 的 3 bit 格雷码:

十进制 二进制 格雷码
0 000 000
1 001 001
2 010 011
3 011 010
4 100 110
5 101 111
6 110 101
7 111 100

二进制转格雷码

规则:

gray = binary xor (binary >> 1)

手算时可以这样理解:

  • 格雷码第一位等于二进制第一位。
  • 从第二位开始,每一位等于当前二进制位与前一位二进制位异或。

例如二进制 1011:

位置 二进制位 前一位 异或结果
1 1 无 1
2 0 1 1
3 1 0 1
4 1 1 0

所以:

1011 -> 1110

格雷码转二进制

规则:

  • 二进制第一位等于格雷码第一位。
  • 从第二位开始,二进制当前位等于“前一位二进制位”和“当前格雷码位”异或。

例如格雷码 1110:

位置 格雷码位 前一位二进制 二进制位
1 1 无 1
2 1 1 0
3 1 0 1
4 0 1 1

得到:

1110 -> 1011

Python 示例

def binary_to_gray(n):
    return n ^ (n >> 1)

def gray_to_binary(g):
    n = g
    while g >> 1:
        g >>= 1
        n ^= g
    return n

print(bin(binary_to_gray(0b1011)))  # 0b1110
print(bin(gray_to_binary(0b1110)))  # 0b1011

CTF 识别要点

  • 题目提示 Gray、格雷码、反射二进制码。
  • 给出一串固定长度二进制块,例如 011 010 110 111。
  • 解码后通常还需要转十进制、ASCII 或继续处理。
  • 如果结果不对,检查是否需要按固定 bit 长度补零。