如何安全地将字节数组转换为字符串并再次转换回来?

103

我并不关心编码和其他类似的东西,只要我能得到完全相同的字节数组就好了。

因此,总结一下:我应该如何将一个字节数组转换成字符串,然后再将那个字符串转回我最初使用的同样的字节数组呢?


1
@Mehrdad等人,这不是与“.NET String to byte Array C#”相同的问题。这里的问题是-如何安全地从字节数组转换为字符串并返回。我使用“神奇”的Latin1编码(Encoding.GetEncoding(28591)),它似乎很好地处理了byte => string => byte。 - Liam
3个回答

203

将字节转换为字符串,然后再转换回来的绝对最安全的方法是使用 base64:

string base64 = Convert.ToBase64String(bytes);
byte[] bytes = Convert.FromBase64String(base64);

这样,您就可以确保不会出现“无效”的Unicode序列,例如只有第一个代理对的情况。没有任何东西会决定将数据规范化为奇怪的内容(全部都是ASCII)。也不可能使用未在Unicode中注册的代码点或类似的内容。哦,而且你也可以放心地复制和粘贴。

是的,每3个字节就会变成4个字符——但为了确保您的数据不被损坏,这是很小的代价。


这篇文章应该替换上面的答案。 :) - Sam Harwell
4
再次,Skeet先生回答了我的问题,并且他甚至在我提问之前就已经回答了它 :) - UnkwnTech
这是一篇非常重要的帖子。我曾经在转换方面遇到了巨大的问题,但解决了所有与字符串/字节数组相关的问题。 - But I'm Not A Wrapper Class
@JonSkeet,我在我的代码中使用Convert.To/From Base64,但当输入包含一些字符如'/'时,它会简单地抛出异常!有什么想法吗? - Roman Ratskey
1
@RuneS:我建议你提出一个新问题,并附上一个简短但完整的程序,以展示问题。 - Jon Skeet
显示剩余2条评论

9
你可以按照下面的方式使用 Convert 类。
/// <summary>
/// Converts a string to byte array
/// </summary>
/// <param name="input">The string</param>
/// <returns>The byte array</returns>
public static byte[] ConvertToByteArray(string input)
{
    return input.Select(Convert.ToByte).ToArray();
}

/// <summary>
/// Converts a byte array to a string
/// </summary>
/// <param name="bytes">the byte array</param>
/// <returns>The string</returns>
public static string ConvertToString(byte[] bytes)
{
    return new string(bytes.Select(Convert.ToChar).ToArray());
}

/// <summary>
/// Converts a byte array to a string
/// </summary>
/// <param name="bytes">the byte array</param>
/// <returns>The string</returns>
public static string ConvertToBase64String(byte[] bytes)
{
    return Convert.ToBase64String(bytes);
}

3

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接