【问题标题】:How is base64 encoded data stored in .Net strings?base64 编码数据如何存储在 .Net 字符串中?
【发布时间】:2016-04-19 12:23:37
【问题描述】:

非常基本的问题,可能是我无法理解的非常基本的答案。

在 .Net 中,如果我使用 base64 对我的 byte[] 进行编码,我会得到一个字符串引用作为回报。但是 .Net 中的字符串是 UTF-16 编码的。那么它究竟是如何存储/表示的呢?

【问题讨论】:

  • 不太确定您的实际问题是什么...... base64 编码的唯一目的是获取仅包含 ASCII 字符的字符串,因此它与字符串的 .NET 编码/表示无关.它应该只被视为一些函数 byte[] -> 字符串,所以你只是得到一个字符串,它像往常一样存储在 .NET 中的 utf-16 编码数据。
  • this 有帮助吗? Base64 只是一种以 ASCII 形式表示二进制数据的编码。并且 UTF-16 是 ASCII 的超集(即,可以用 ASCII 表示的所有内容都可以以相同的方式在 UTF-16 中表示)。因此 ASCII 文本可以很容易地存储在 .NET 字符串中。

标签: c# .net string base64 utf-16


【解决方案1】:

但 .Net 中的字符串是 UTF-16 编码的。那么它究竟是如何存储/表示的呢?

您已经回答了自己的问题:由于 .NET 中的字符串以 UTF16 格式存储,这正是 base64 文本的存储/表示方式。

将二进制数据编码为 base64 只是简单地将一个表示问题换成另一个问题:直接二进制数据被分解为一个 6 位值流,这些值又由一组 64 个不同的字符表示。既然数据是用字符表示的,那么您需要决定如何表示字符

但在内存中,.NET 使用 UTF16。所以已经为您做出了决定:base64 字符串值的字符使用 UTF16 表示。


现在,如果你想保存这些字符,或者通过网络发送它们,或者让它们离开 .NET 环境,你将不得不重新编码它们以满足你的需要。至少,即使您只是将它们作为 UTF16 发送,.NET 将(除非不安全代码)要求您将它们传递给将转换 . 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 };

这正是字符串"Hello",编码为ASCII,然后编码为base64,将使用.NET字符串值在内存中存储/表示的方式。这是表示字符串文字 "SGVsbG8=" 的 UTF16 编码文本的数字字节值。

【讨论】:

  • 因此,如果我随后将字符串“SGVsbG8=”发送到肥皂客户端,那么我实际发送的是 UTF-16 编码字符串。客户将依次存储它。由开发人员来告诉代码,表示这个字符串的字节实际上是 base64 编码的并且应该被解码。
  • “如果我随后发送...到一个肥皂客户端,我实际发送的是一个 UTF-16 编码字符串” -- 不,不一定。这取决于用于通信的编码。它在内存中是 UTF16,但您只能这么说,而且您只能这么说,因为 .NET 始终使用它。然后可以使用任何有效的文本编码将该字符串传输到某个远程进程,例如 SOAP 客户端。当客户端接收到数据时,它会(可能)将接收到的字节解码回内存中字符串的任何 its 表示形式,然后从中解码 base64。
猜你喜欢
  • 1970-01-01
  • 2011-09-10
  • 1970-01-01
  • 2021-03-13
  • 1970-01-01
  • 1970-01-01
  • 2021-10-27
  • 2011-10-31
相关资源
最近更新 更多