如何将字符串转换为Base64字节数组,这样做是否有效?

37

我正在尝试编写一个将字符串转换为Base64字节数组的函数。我已经尝试过这种方法:

public byte[] stringToBase64ByteArray(String input)
{
    byte[] ret = System.Text.Encoding.Unicode.GetBytes(input);
    string s = Convert.ToBase64String(input);
    ret = System.Text.Encoding.Unicode.GetBytes(s);
    return ret;
}

如果字符串是Unicode编码,那么这个函数会产生有效的结果吗?谢谢!


1
什么是base64字节数组?baseNN适用于文本表示。 - H H
1
@Henk:我认为他的意思是将Base64字符串转换为字节数组。 - Bobby
1
ToBase64String函数需要byte[]类型的参数,而你提供的是字符串。 - Adeel
5个回答

58
您可以使用以下方法:

从byte[]转换为字符串:

byte[] array = somebytearray;

string result = Convert.ToBase64String(array);

从字符串转换为byte[]:

array = Convert.FromBase64String(result);


4
这两种方法都无法将非base64字符串转换为字节数组。 - mcmillab
4
Convert.FromBase64String()方法需要接收一个已经进行了Base64编码的字符串作为参数,它不能处理普通的字符串。这并没有回答问题。 - Tamir Adler

23

看起来还好,尽管方法很奇怪。但是使用 Encoding.ASCII.GetBytes() 将 base64 字符串转换为 byte[]。Base64 编码只包含 ASCII 字符。使用 Unicode 会使每个字符多出一个 0 字节。


谢谢!我会遵循你的建议,使用Encoding.ASCII.GetBytes()。 - Tomas Vinter

2

将字符串表示为字符串表示的blob很奇怪...你不能直接使用字符串吗?

该字符串始终是unicode;变化的是编码后的字节。由于base-64始终小于128,在最后一部分中使用unicode似乎有些过度(除非这是线路格式要求)。个人建议在最后一个GetBytes中使用UTF8或ASCII,以便每个base-64字符仅占用一个字节。


1
是的,这很奇怪。我这样做的原因是因为我正在调用一个旧遗留系统的API,该系统由于某种原因希望将字符串作为base64字节数组传递。 - Tomas Vinter

0

.NET 中的所有字符串都是 Unicode 编码。这段代码将会产生有效结果,但 BASE64 字符串的使用者也应该启用 Unicode。


0

是的,它会输出一个以UTF-16小端表示法编码的base64字符串。请注意,据我所知,在base64中使用UTF-16并不常见,通常使用ASCII或UTF-8。然而,重要的是发送方和接收方同意使用哪种编码。

我不明白为什么你要将base64字符串重新转换为字节数组:base64用于在传输时避免编码不兼容,因此应该将其保留为字符串,并按照您用于传输数据的协议所需的格式输出。正如Marc所说,对于这个目的来说使用UTF-16绝对是过度的,因为base64只包含64个字符,所有字符都在128以下。


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