# 字符编码详解：ASCII、EBCDIC、十六进制与二进制

> 理解字符编码基础——ASCII 表、银行系统中的 EBCDIC、十六进制和二进制表示，以及编码兼容性问题。

Canonical: https://hsmkit.com/zh/guides/character-encoding-ascii-ebcdic/

Last updated: 2026-05-21

字符编码是计算机表示文本的基础。ASCII 和 EBCDIC 是两种最古老的编码系统，理解它们——特别是它们之间的差异——在处理遗留支付系统、大型机和 HSM 时至关重要。本文介绍这两种编码以及如何在它们之间转换。

## 什么是字符编码？

字符编码将字符（字母、数字、符号）映射为计算机可以存储和处理的数值。字母 `A` 在内存中并不存在——它是以数字形式存储的：在 ASCII 中是 `65`，在 EBCDIC 中是 `193`。

您遇到的每段文本都使用某种编码。如果用错误的编码解释字节，会得到乱码——这就是经典的"乱码"问题。

## ASCII

**ASCII**（美国信息交换标准代码）于 1963 年发布，成为英文文本的主导编码。

### ASCII 表结构

- **128 个字符**（0-127），使用 7 位
- **控制字符**：0-31 和 127（不可打印）
- **可打印字符**：32-126

关键范围：

| 十进制 | 十六进制 | 字符 | 描述 |
|--------|---------|------|------|
| 48-57 | 30-39 | `0-9` | 数字 |
| 65-90 | 41-5A | `A-Z` | 大写字母 |
| 97-122 | 61-7A | `a-z` | 小写字母 |
| 32 | 20 | 空格 | 空白字符 |
| 33-47 | 21-2F | `! " # $ %...` | 常用标点符号 |

### 常见控制字符

| 十进制 | 十六进制 | 名称 | 描述 |
|--------|---------|------|------|
| 0 | 00 | NUL | 空字符 |
| 10 | 0A | LF | 换行 |
| 13 | 0D | CR | 回车 |
| 27 | 1B | ESC | 转义 |
| 9 | 09 | HT | 水平制表符 |

### ASCII 在现代系统中的应用

ASCII 是几乎所有现代编码的基础。UTF-8 与 ASCII 向后兼容——任何有效的 ASCII 文本也是有效的 UTF-8。这就是为什么 ASCII 知识仍然至关重要。

## EBCDIC

**EBCDIC**（扩展二进制编码十进制交换码）由 IBM 于 1963-1964 年为其 System/360 大型机开发。它仍在 IBM 大型机（z/OS）和 AS/400（IBM i）系统中使用。

### EBCDIC 表结构

- **256 个字符**（0-255），使用 8 位
- 布局与 ASCII 不同——这是混淆的根源
- 字母范围中有间隙（不连续）

关键范围：

| 十进制 | 十六进制 | 字符 | 描述 |
|--------|---------|------|------|
| 240-249 | F0-F9 | `0-9` | 数字 |
| 193-202 | C1-CA | `A-J` | 字母 A-J |
| 209-217 | D1-D9 | `J-R` | 字母 J-R |
| 226-233 | E2-E9 | `S-Z` | 字母 S-Z |
| 129-137 | 81-89 | `a-i` | 小写 a-i |

注意**间隙**——EBCDIC 字母不像 ASCII 那样连续。这使得基于范围的字符检查更加复杂。

### EBCDIC 在支付系统中的应用

EBCDIC 仍广泛用于：

- **IBM 大型机**（z/ISO-TP、z/VSE）处理金融交易
- **支付交换器**运行在大型机平台上
- **ATM 网络**使用 EBCDIC 编码的 ISO 8583 消息
- **卡片处理系统**需要与遗留大型机集成

许多 HSM 支持 EBCDIC，因为它们直接与大型机支付系统交互。

## ASCII vs EBCDIC 对比

| 方面 | ASCII | EBCDIC |
|------|-------|--------|
| 位宽 | 7 位（存储在 8 位中） | 8 位 |
| 总字符数 | 128 | 256 |
| 数字 | 48-57（连续） | 240-249（连续） |
| 大写字母 | 65-90（连续） | 193-202、209-217、226-233（有间隙） |
| 小写字母 | 97-122（连续） | 129-137、145-153、162-169（有间隙） |
| 来源 | 行业标准 | IBM |
| 现代使用 | 通用 | 仅限大型机 |

### 数字偏移量

一个有用的事实：在 ASCII 中，数字从 48（十六进制 `30`）开始。在 EBCDIC 中，数字从 240（十六进制 `F0`）开始。将数字字符转换为其数值：

- ASCII：`char - 0x30`（例如，`'5'` = 0x35，所以 `0x35 - 0x30 = 5`）
- EBCDIC：`char - 0xF0`（例如，`'5'` = 0xF5，所以 `0xF5 - 0xF0 = 5`）

## 十六进制和二进制表示

每种编码映射到特定的十六进制值。理解十六进制表示对于 HSM 和支付工作至关重要：

### 示例："HELLO" 在不同编码中的表示

| 字符 | ASCII 十六进制 | EBCDIC 十六进制 |
|------|---------------|----------------|
| H | 48 | C8 |
| E | 45 | C5 |
| L | 4C | D3 |
| L | 4C | D3 |
| O | 4F | D6 |

相同的单词根据编码不同产生完全不同的字节序列。

### 编码间转换

要在 ASCII 和 EBCDIC 之间转换文本，需要一个**转换表**，将每个字符从一种编码映射到另一种编码。这不是简单的算术运算——需要查找。

常见转换方法：
1. 在源编码表中查找源字节 → 得到字符
2. 在目标编码表中查找字符 → 得到目标字节

## 编码兼容性问题

### 数据损坏

当 EBCDIC 编码的数据被解释为 ASCII（反之亦然）时，结果是乱码：

```
EBCDIC 字节: C8 C5 D3 D3 D6  （表示 "HELLO"）
作为 ASCII 解释: ÈÅÓÓÖ  （无意义的字符）
```

这是在大型机和现代系统之间传输数据时的常见问题。

### ISO 8583 消息

ISO 8583 支付消息根据系统可以使用 ASCII 或 EBCDIC 编码。当 HSM 处理这些消息时，必须知道使用哪种编码。编码不匹配会导致：
- PAN 提取错误
- MAC 计算错误
- PIN 块处理失败

### HSM 通信

许多 HSM（特别是 Thales/PayShield）使用 ASCII 进行命令通信，但某些 IBM 兼容的 HSM 使用 EBCDIC。始终检查您的 HSM 文档。

## 实际应用场景

### 大型机集成

将现代应用程序与 IBM 大型机集成时：
- 发送前将请求从 ASCII 转换为 EBCDIC
- 接收后将响应从 EBCDIC 转换为 ASCII
- 仔细处理数值字段（压缩十进制、BCD）

### 调试支付消息

调试 ISO 8583 或 APDU 命令时：
- 检查预期的编码
- 使用正确的表将十六进制值转换为字符
- 寻找常见模式：数字（ASCII 30-39，EBCDIC F0-F9）

### 日志分析

大型机日志通常是 EBCDIC 编码的。在现代系统上分析这些日志时，需要转换文本才能阅读。

## 扩展 ASCII 和代码页

除了基本 ASCII（0-127），**扩展 ASCII**（128-255）因代码页而异：

- **CP437**：原始 IBM PC 字符集
- **CP850**：多语言拉丁 I
- **ISO 8859-1（Latin-1）**：西欧
- **Windows-1252**：Latin-1 的超集

类似地，EBCDIC 有多个代码页（CP037 用于美国英语，CP500 用于国际）。

## 在线工具

使用 [字符编码转换器](/character-encoding)：

- 在 ASCII、EBCDIC、十六进制、二进制和 Base64 之间转换文本
- 并排查看完整的 ASCII 和 EBCDIC 表
- 通过查看字节级表示调试编码问题
- 转换大型机数据以进行现代系统分析

所有处理都在浏览器中进行——您的数据永远不会离开您的设备。
