C# base64编码数据如何存储在.Net字符串中?

C# base64编码数据如何存储在.Net字符串中?,c#,.net,string,base64,utf-16,C#,.net,String,Base64,Utf 16,这是一个非常基本的问题,可能有一个非常基本的答案,我就是想不起来 在.Net中,如果使用base64对字节[]进行编码,则返回一个字符串引用。但是.Net中的字符串是UTF-16编码的。那么,它实际上是如何存储/表示的呢 但是.Net中的字符串是UTF-16编码的。那么,它实际上是如何存储/表示的呢 您已经回答了自己的问题:由于.NET中的字符串存储为UTF16,因此base64文本就是这样存储/表示的 将二进制数据编码为base64只需将一个表示问题转换为另一个表示问题:直接二进制数据被分解为

这是一个非常基本的问题,可能有一个非常基本的答案,我就是想不起来

在.Net中,如果使用base64对字节[]进行编码,则返回一个字符串引用。但是.Net中的字符串是UTF-16编码的。那么,它实际上是如何存储/表示的呢

但是.Net中的字符串是UTF-16编码的。那么,它实际上是如何存储/表示的呢

您已经回答了自己的问题:由于.NET中的字符串存储为UTF16,因此base64文本就是这样存储/表示的

将二进制数据编码为base64只需将一个表示问题转换为另一个表示问题:直接二进制数据被分解为一个6位值流,这些值又由一组64个不同的字符表示。现在数据由字符表示,您需要决定如何表示字符

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


现在,如果您想保存这些字符,或者通过网络发送它们,或者让它们离开.NET环境,您必须重新编码它们以满足您的需要。至少,即使您只是以UTF16的形式发送它们,.NET也会(除非使用不安全的代码)要求您通过某个对象(例如,
StreamWriter
Encoding
,等等)将.NET字符串转换为必要的字节,当然,如果您需要其他编码中的文本,您还必须指定(例如,通过使用适当的
编码
对象)


例如,假设我有一个字符串
“Hello”
,我想将其编码为base64(忽略这一点,如果我真的只有文本数据,我会直接将其编码为字符串:)。我需要做的第一件事是决定对原始字符串使用什么文本编码,因为base64只对二进制数据进行编码。我选择ASCII:
Encoding.ASCII.GetBytes(“Hello”)
生成数组
{72101108108111}

现在我有了一个字节数组,可以将其编码为base64:
Convert.ToBase64String(新字节[]{72,101,108,108,111})
生成字符串值
“SGVsbG8=“
(表示为C#literal…当然双引号是literal语法的一部分,而不是字符串本身)

所以你的问题归结到,这个字符串在内存中是如何表示的?正如您所期望的,它被表示为UTF16。这看起来像是这个字节数组:

{ 83, 0, 71, 0, 86, 0, 115, 0, 98, 0, 71, 0, 56, 0, 61, 0 };

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

不太确定您的实际问题是什么。。。。base64编码的唯一目的是获取只包含ASCII字符的字符串,因此它与字符串的.NET编码/重新表示无关。它应该只被视为某个函数字节[]->字符串,所以您只需要得到一个字符串,它像通常的utf-16编码数据一样存储在.NET中。这有帮助吗?Base64只是一种以ASCII格式表示二进制数据的编码。UTF-16是ASCII的超集(即,可以用ASCII表示的所有内容都可以用UTF-16以相同的方式表示)。因此ASCII文本可以很容易地存储在.NET字符串中。因此,如果我将字符串“SGVsbG8=”发送到soap客户端,那么我实际发送的是UTF-16编码的字符串。客户机将反过来存储它。由开发人员告诉代码,表示此字符串的字节实际上是base64编码的,并且应该对其进行解码。“如果我随后将…发送到soap客户端,我实际发送的是UTF-16编码的字符串”——不,不一定。这取决于通信使用的编码。它在内存中是UTF16,但这就是你所能说的,你只能说,因为.NET总是使用UTF16。然后可以使用任何有效的文本编码将该字符串传输到某个远程进程,如SOAP客户端。当客户端接收到数据时,它将(大概)将接收到的字节解码回它在内存中表示的字符串,然后从中解码base64。