我原以为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("-", "");
}
答案 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)格式查看字节数据。