base64 编码的数据如何存储在 .Net 字符串中?
How is base64 encoded data stored in .Net strings?
非常基本的问题,可能有一个非常基本的答案,我就是想不通。
在 .Net 中,如果我使用 base64 对我的 byte[] 进行编码,我会在 return 中得到一个字符串引用。但是 .Net 中的字符串是 UTF-16 编码的。那么它究竟是怎样 stored/represented?
But strings in .Net are UTF-16 encoded. So how exactly is it actually stored/represented?
您已经回答了您自己的问题:由于 .NET 中的字符串存储为 UTF16,因此 确切地base64 文本是如何 stored/represented.
将二进制数据编码为 base64 只是将一个表示问题换成了另一个表示问题:直接二进制数据被分解为 6 位值流,这些值又由一组 64 个不同的字符表示。既然数据是用字符表示的,那么您需要决定如何表示个字符。
但是 in-memory,.NET 使用 UTF16。所以已经为你做出了决定:base64字符串值的字符使用UTF16表示。
现在,如果您想保存这些字符,或者通过网络发送它们,或者让它们离开 .NET 环境,您将不得不 re-encode 它们以满足您的需要。至少,即使您只是将它们作为 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# 文字……当然 double-quotes是文字语法的一部分,而不是字符串本身)。
所以您的问题归结为,该字符串在内存中是如何表示的?好吧,正如您所期望的那样,它表示为 UTF16。这看起来像这个字节数组:
{ 83, 0, 71, 0, 86, 0, 115, 0, 98, 0, 71, 0, 56, 0, 61, 0 };
这正是字符串 "Hello"
编码为 ASCII 然后编码为 base64 的方式 stored/represented in-memory 使用 .NET 字符串值。这是表示字符串文字 "SGVsbG8="
的 UTF16 编码文本的数字字节值。
非常基本的问题,可能有一个非常基本的答案,我就是想不通。
在 .Net 中,如果我使用 base64 对我的 byte[] 进行编码,我会在 return 中得到一个字符串引用。但是 .Net 中的字符串是 UTF-16 编码的。那么它究竟是怎样 stored/represented?
But strings in .Net are UTF-16 encoded. So how exactly is it actually stored/represented?
您已经回答了您自己的问题:由于 .NET 中的字符串存储为 UTF16,因此 确切地base64 文本是如何 stored/represented.
将二进制数据编码为 base64 只是将一个表示问题换成了另一个表示问题:直接二进制数据被分解为 6 位值流,这些值又由一组 64 个不同的字符表示。既然数据是用字符表示的,那么您需要决定如何表示个字符。
但是 in-memory,.NET 使用 UTF16。所以已经为你做出了决定:base64字符串值的字符使用UTF16表示。
现在,如果您想保存这些字符,或者通过网络发送它们,或者让它们离开 .NET 环境,您将不得不 re-encode 它们以满足您的需要。至少,即使您只是将它们作为 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# 文字……当然 double-quotes是文字语法的一部分,而不是字符串本身)。
所以您的问题归结为,该字符串在内存中是如何表示的?好吧,正如您所期望的那样,它表示为 UTF16。这看起来像这个字节数组:
{ 83, 0, 71, 0, 86, 0, 115, 0, 98, 0, 71, 0, 56, 0, 61, 0 };
这正是字符串 "Hello"
编码为 ASCII 然后编码为 base64 的方式 stored/represented in-memory 使用 .NET 字符串值。这是表示字符串文字 "SGVsbG8="
的 UTF16 编码文本的数字字节值。