You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何正确实现byte[]与string双向转换?解决转换后不一致问题

字节数组与字符串的双向正确转换方案

问题原因

你遇到的转换后字节数组不一致问题,根源在于ASCII编码的局限性:ASCII仅能表示0x00到0x7F范围内的字节值,而AES密钥生成的是0x00到0xFF的全范围二进制数据。当用Encoding.ASCII.GetString()转换超出0x7F的字节时,这些字节会被强制替换为?(对应ASCII码0x3F),后续再用Encoding.ASCII.GetBytes()转回时,这些位置的字节就变成了0x3F,自然和原始数组不一致。

正确解决方案

二进制数据转字符串的安全方式是使用Base64编码或十六进制(Hex)编码,这两种编码专门设计用于将任意二进制数据转换为可打印字符,且能保证双向转换的完全一致。

方案一:Base64编码(推荐)

Base64是最常用的二进制转字符串方案,编码后的字符串长度适中、效率较高。修改你的代码如下:

internal class TestByteConversion
{
    public TestByteConversion()
    {
        var aes = Aes.Create();
        aes.GenerateKey();
        var keyAsString = GetKeyAsString(aes.Key);

        var keyAsBytes = GetKeyFromString(keyAsString);

        var table = new ConsoleTable("ID", "origin", "new value");
        for (var i = 0; i < aes.Key.Length; i++)
        {
            table.AddRow(i, aes.Key[i], keyAsBytes[i]);
        }
        table.Write();
    }

    public static byte[] GetKeyFromString(string keyAsString)
    {
        // 从Base64字符串转回字节数组
        return Convert.FromBase64String(keyAsString);
    }

    public static string GetKeyAsString(byte[] byteArray)
    {
        // 将字节数组转换为Base64字符串
        return Convert.ToBase64String(byteArray);
    }
}

方案二:十六进制(Hex)编码

Hex编码会将每个字节转换为两个十六进制字符,可读性更强,但字符串长度是原始字节数组的两倍。示例代码:

internal class TestByteConversion
{
    public TestByteConversion()
    {
        var aes = Aes.Create();
        aes.GenerateKey();
        var keyAsString = GetKeyAsString(aes.Key);

        var keyAsBytes = GetKeyFromString(keyAsString);

        var table = new ConsoleTable("ID", "origin", "new value");
        for (var i = 0; i < aes.Key.Length; i++)
        {
            table.AddRow(i, aes.Key[i], keyAsBytes[i]);
        }
        table.Write();
    }

    public static byte[] GetKeyFromString(string keyAsString)
    {
        // 从Hex字符串转回字节数组
        byte[] bytes = new byte[keyAsString.Length / 2];
        for (int i = 0; i < bytes.Length; i++)
        {
            bytes[i] = Convert.ToByte(keyAsString.Substring(i * 2, 2), 16);
        }
        return bytes;
    }

    public static string GetKeyAsString(byte[] byteArray)
    {
        // 将字节数组转换为Hex字符串
        return BitConverter.ToString(byteArray).Replace("-", "");
    }
}

关键说明

  • 永远不要用ASCII、UTF-8(除非能保证字节数组是合法的UTF-8文本数据)等文本编码转换任意二进制数据,这类编码是为文本设计的,无法处理非文本的二进制字节。
  • Base64和Hex都是无损编码,能确保转换前后字节数组完全一致,适合存储或传输二进制数据(比如加密密钥、文件片段等)。

内容的提问来源于stack exchange,提问作者Frank Mehlhop

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 19:47:24