好的,在 C# 中实现 ASCII 码和字符串的相互转换非常常见。这里需要区分两个概念:
- 字符与 ASCII 码的互转:处理单个
char类型。 - 字符串与 ASCII 字节数组的互转:处理
string类型和byte[]类型的数组。
下面我将为您提供这两种情况的详细代码示例和解释。
![图片[1]_C#实现ASCII和字符串相互转换的代码示例_知途无界](https://zhituwujie.com/wp-content/uploads/2026/01/d2b5ca33bd20260101125735.png)
核心概念
- ASCII (American Standard Code for Information Interchange):美国信息交换标准代码,用于将字符映射为数字(0-127)。在 C# 中,
char类型是 16 位的 Unicode 字符,但对于基本的 ASCII 字符(如英文字母、数字、常见符号),它的前 128 个值与 ASCII 码是一致的。 - 编码 (Encoding):当我们将字符串转换为字节数组时,需要指定一种编码规则。对于纯英文和数字,我们可以使用
Encoding.ASCII,它会将每个char转换为一个字节。如果字符串包含中文等非 ASCII 字符,Encoding.ASCII会用?代替,这时应使用Encoding.UTF8或Encoding.Unicode。
1. 单个字符与 ASCII 码的互转
这是最直接的转换,使用 C# 内置的类型转换关键字 (int) 和 (char)。
示例代码
using System;
class Program
{
static void Main()
{
// 1. 字符 -> ASCII 码 (整数)
char myChar = 'A';
int asciiValue = (int)myChar;
Console.WriteLine($"字符 '{myChar}' 的 ASCII 码是: {asciiValue}"); // 输出: 65
char anotherChar = '9';
Console.WriteLine($"字符 '{anotherChar}' 的 ASCII 码是: {(int)anotherChar}"); // 输出: 57
// 2. ASCII 码 (整数) -> 字符
int asciiCode = 97;
char correspondingChar = (char)asciiCode;
Console.WriteLine($"ASCII 码 {asciiCode} 对应的字符是: '{correspondingChar}'"); // 输出: a
int anotherAsciiCode = 33;
Console.WriteLine($"ASCII 码 {anotherAsciiCode} 对应的字符是: '{(char)anotherAsciiCode}'"); // 输出: !
// 3. 遍历字符串中的每个字符并显示其 ASCII 码
string message = "Hi!";
Console.Write($"字符串 \"{message}\" 中每个字符的 ASCII 码: ");
foreach (char c in message)
{
Console.Write($"{(int)c} "); // 输出: 72 105 33
}
Console.WriteLine(); // 换行
}
}
关键点
- 使用
(int)char可以直接得到字符的 ASCII 整数值。 - 使用
(char)int可以将一个在 0-127 范围内的整数转换回对应的 ASCII 字符。
2. 字符串与 ASCII 字节数组的互转
这才是实际应用中更常见的场景,例如在网络传输、文件存储时需要处理字节流。我们使用 System.Text.Encoding 类来完成这个工作。
示例代码
using System;
using System.Text; // 必须引入这个命名空间
class Program
{
static void Main()
{
string originalString = "Hello ASCII!";
// 1. 字符串 -> ASCII 字节数组 (byte[])
// 使用 Encoding.ASCII.GetBytes(string) 方法
byte[] asciiBytes = Encoding.ASCII.GetBytes(originalString);
Console.WriteLine($"原始字符串: \"{originalString}\"");
Console.Write("转换后的 ASCII 字节数组: ");
foreach (byte b in asciiBytes)
{
// 将每个字节以十六进制和十进制形式打印出来,更清晰
Console.Write($"0x{b:X2}({b}) ");
}
Console.WriteLine(); // 输出: 0x48(72) 0x65(101) 0x6C(108) ... 0x21(33)
// 2. ASCII 字节数组 (byte[]) -> 字符串
// 使用 Encoding.ASCII.GetString(byte[]) 方法
string decodedString = Encoding.ASCII.GetString(asciiBytes);
Console.WriteLine($"从字节数组解码回来的字符串: \"{decodedString}\""); // 输出: Hello ASCII!
// 3. 处理包含非 ASCII 字符的字符串 (重要!)
string chineseString = "你好 C#";
// 使用 ASCII 编码处理中文会产生乱码(用 ? 代替)
byte[] asciiBytesForChinese = Encoding.ASCII.GetBytes(chineseString);
string decodedFromAscii = Encoding.ASCII.GetString(asciiBytesForChinese);
Console.WriteLine($"\n原始中文字符串: \"{chineseString}\"");
Console.WriteLine($"使用 ASCII 编码后: \"{decodedFromAscii}\""); // 输出: ?? C# (出现了乱码)
// 应该使用 UTF8 或 Unicode 来处理多语言
byte[] utf8Bytes = Encoding.UTF8.GetBytes(chineseString);
string decodedFromUtf8 = Encoding.UTF8.GetString(utf8Bytes);
Console.WriteLine($"使用 UTF8 编码后: \"{decodedFromUtf8}\""); // 输出: 你好 C# (正确还原)
}
}
关键点
- 引入命名空间:使用
Encoding类需要using System.Text;。 - **
Encoding.ASCII.GetBytes(string)**:将字符串转换为字节数组。对于非 ASCII 字符,此方法会将其替换为?的 ASCII 码(63)。 - **
Encoding.ASCII.GetString(byte[])**:将字节数组转换回字符串。 - 处理多语言:如果字符串可能包含中文、日文等非英文字符,切勿使用
Encoding.ASCII。正确的做法是使用Encoding.UTF8或Encoding.Unicode,它们能正确处理所有 Unicode 字符,保证数据的完整性。
总结表格
| 转换方向 | 方法/操作 | 代码示例 | 注意事项 |
|---|---|---|---|
| 字符 → ASCII 码 | 强制类型转换 | int code = (int)'A'; | 得到的是整数值 (e.g., 65) |
| ASCII 码 → 字符 | 强制类型转换 | char c = (char)65; | 仅适用于 0-127 的整数 |
| 字符串 → ASCII 字节数组 | Encoding.ASCII.GetBytes() | byte[] bytes = Encoding.ASCII.GetBytes("Hello"); | 非 ASCII 字符会变成 ? |
| ASCII 字节数组 → 字符串 | Encoding.ASCII.GetString() | string s = Encoding.ASCII.GetString(bytes); | |
| 字符串 → UTF8 字节数组 | Encoding.UTF8.GetBytes() | byte[] bytes = Encoding.UTF8.GetBytes("你好"); | 推荐用于处理多语言文本 |
| UTF8 字节数组 → 字符串 | Encoding.UTF8.GetString() | string s = Encoding.UTF8.GetString(bytes); | 推荐用于还原多语言文本 |
希望这些代码示例能帮助您清晰地理解并实现 ASCII 与字符串之间的相互转换。
© 版权声明
文中内容均来源于公开资料,受限于信息的时效性和复杂性,可能存在误差或遗漏。我们已尽力确保内容的准确性,但对于因信息变更或错误导致的任何后果,本站不承担任何责任。如需引用本文内容,请注明出处并尊重原作者的版权。
THE END

























暂无评论内容