非常基本的问题可能是一个非常基本的答案,我无法解决这个问题。
在.Net中,如果我使用base64编码我的byte [],我会得到一个字符串引用作为回报。但.Net中的字符串是UTF-16编码的。那么它究竟是如何实际存储/表示的呢?
答案 0 :(得分:2)
但.Net中的字符串是UTF-16编码的。那么它究竟是如何实际存储/表示的呢?
您已经回答了自己的问题:因为.NET中的字符串存储为UTF16,即完全如何存储/表示base64文本。
将二进制数据编码为base64只会将一个表示问题换成另一个表示问题:直接二进制数据被分成6位值的流,这些值又由一组64个不同的字符表示。现在数据由字符表示,您需要决定如何表示字符。
但是在内存中,.NET使用UTF16。因此,已经为您做出了决定:base64字符串值的字符使用UTF16表示。
现在,如果您想保存这些字符,或通过网络发送它们,或者让它们离开.NET环境,您将不得不重新编码它们以满足您的需求。至少,即使您只是将它们作为UTF16发送,.NET也会(禁止使用不安全的代码)要求您将它们传递给某个对象(例如StreamWriter
,Encoding
等。 )将.NET字符串转换为必要的字节,当然如果您需要其他编码中的文本,您也必须指定它(例如,通过使用适当的Encoding
对象)
例如,让我说我有字符串"Hello"
,我想将其编码为base64(如果我真的只有文本数据,请忽略它,我只是直接将其编码为字符串:))。我需要做的第一件事是决定用于原始字符串的文本编码,因为base64只编码二进制数据。我选择ASCII:Encoding.ASCII.GetBytes("Hello")
产生数组{ 72, 101, 108, 108, 111 }
。
现在我有一个字节数组,我可以编码为base64:Convert.ToBase64String(new byte[] { 72, 101, 108, 108, 111 })
产生字符串值"SGVsbG8="
(表示为C#文字...当然双引号是其中的一部分文字语法,而不是字符串本身。)
所以你的问题归结为,那个字符串在内存中是如何表示的?嗯,它表示为UTF16,正如您所期望的那样。这看起来像这个字节数组:
{ 83, 0, 71, 0, 86, 0, 115, 0, 98, 0, 71, 0, 56, 0, 61, 0 };
这正是使用.NET字符串值将编码为ASCII然后作为base64的字符串"Hello"
存储/表示在内存中的方式。这是表示字符串文字"SGVsbG8="
所在的UTF16编码文本的数字字节值。