如何正确实现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
相关产品推荐
相关产品推荐

