C#实现ASCII和字符串相互转换的代码示例

好的,在 C# 中实现 ASCII 码和字符串的相互转换非常常见。这里需要区分两个概念:

  1. 字符与 ASCII 码的互转​:处理单个 char 类型。
  2. 字符串与 ASCII 字节数组的互转​:处理 string 类型和 byte[] 类型的数组。

下面我将为您提供这两种情况的详细代码示例和解释。

图片[1]_C#实现ASCII和字符串相互转换的代码示例_知途无界

核心概念

  • ASCII (American Standard Code for Information Interchange)​​:美国信息交换标准代码,用于将字符映射为数字(0-127)。在 C# 中,char 类型是 16 位的 Unicode 字符,但对于基本的 ASCII 字符(如英文字母、数字、常见符号),它的前 128 个值与 ASCII 码是一致的。
  • 编码 (Encoding)​​:当我们将字符串转换为字节数组时,需要指定一种编码规则。对于纯英文和数字,我们可以使用 Encoding.ASCII,它会将每个 char 转换为一个字节。如果字符串包含中文等非 ASCII 字符,Encoding.ASCII 会用 ? 代替,这时应使用 Encoding.UTF8Encoding.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.UTF8Encoding.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
喜欢就点个赞,支持一下吧!
点赞44 分享
评论 抢沙发
头像
欢迎您留下评论!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容