BitConverter.ToString()vs Convert.ToBase64String()

时间:2010-02-25 21:26:47

标签: c# .net

我原以为Convert.ToBase64String()是用于创建字节数组的base64字符串的方法,但我最近遇到了BitConverter.ToString()。这两者有什么区别?

更具体地说,何时应该使用另一个?


例如在this question中关于创建MD5摘要,CraigS对答案的评论说明“ToBase64String不返回我想要的内容。但是,字节数组周围的BitConverter.ToString执行特技“。

BitConverter.ToString(
    MD5.Create().ComputeHash(Encoding.Default.GetBytes(StringToEncode))
).Replace("-", "")

VS

Convert.ToBase64String(
    MD5.Create().ComputeHash(Encoding.Default.GetBytes(StringToEncode))
)

此外,应该使用什么来将图像编码为base64?

public string ImageToBase64(int Img_ID)
{
    byte[] tempBytes = showImageById(Img_ID); // get image from DB
    return Convert.ToBase64String(tempBytes);
}

VS

public string ImageToBase64(int Img_ID)
{
    byte[] tempBytes = showImageById(Img_ID); // get image from DB
    return BitConverter.ToString(tempBytes).Replace("-", "");
}

3 个答案:

答案 0 :(得分:12)

来自MSDN的Convert.ToBase64String

  

基数为64的数字按升序排列   从零开始是大写字符   “A”到“Z”,小写字符   “a”到“z”,数字“0”到“9”,   和符号“+”和“/”。该   无价值的字符,“=”,用于   尾随填充。

wikipedia article on Base64对算法实际的工作原理更为启发。

BitConverter将每个字节的十六进制值作为两位数,并用破折号一个接一个地追加它们。

两者都可以双向转换。

为了便于阅读,BitConverter任何一天都击败Base64字符串,但Base64字符串更紧凑。

答案 1 :(得分:12)

BitConverter.ToString不是Base64编码,它转换为带连字符的十六进制(Base 16,每个字节之间用短划线)。

最终,使用对您的特定用途有意义的那个。如果您通过文本媒体(例如http)发送比特,请使用Base64,因为您必须传输较少的整体数据。

如果您只想向用户显示某些二进制数据的文本表示,可以使用BitConverter.ToString()

答案 2 :(得分:7)

ToString method on BitConverter将以十六进制表示形式给出字节数组(基数为16)。

ToBase64String method on the Convert class将为您提供base 64-encoded string

它们都执行将字节数组转换为字符串表示的功能,然后可以将其反转(这不是单向转换)。

如果您对结果字符串的长度有疑虑,通常最好在ToBase64String上使用Convert方法。因为base-64可以在基数中包含一个字符,表示更多的值(比base-16多4倍),所以使用较少数量的字符可以表示较大的数字。

如果您担心可读性(例如,将文件中的字节显示给程序员,或者显示字节数据的显示器)那么使用ToString方法更有意义BitConverter,因为大多数人习惯于以十六进制(base-16)格式查看字节数据。