为什么ToBase64String将16字节字符串更改为24字节

为什么ToBase64String将16字节字符串更改为24字节,base64,Base64,我有以下代码。当我检查变量I的值时,它是16字节,但当输出转换为Base64时,它是24字节 byte[] bytOut = ms.GetBuffer(); int i = 0; for (i = 0; i < bytOut.Length; i++) if (bytOut[i] == 0) break; // convert into Base64 so that the res

我有以下代码。当我检查变量I的值时,它是16字节,但当输出转换为Base64时,它是24字节

   byte[] bytOut = ms.GetBuffer();
        int i = 0;
        for (i = 0; i < bytOut.Length; i++)
            if (bytOut[i] == 0)
                break;

        // convert into Base64 so that the result can be used in xml

        return System.Convert.ToBase64String(bytOut, 0, i);
byte[]bytOut=ms.GetBuffer();
int i=0;
对于(i=0;i

这是预期的吗?我正在尝试减少存储,这是我的问题之一。

是的,您会看到一些扩展。您在一个只有64个字符的基中表示数据。所有这些无法打印的ASCII字符仍然需要一种编码方式。因此,您最终会稍微扩展数据

这里有一个链接解释了多少:


编辑:根据您上面的评论,如果您需要减小大小,您应该在加密之前考虑压缩数据。这将使您从压缩中获得最大的好处。压缩加密的二进制文件不起作用

另一方面,这是因为base64字符串只能包含64个字符(这是因为它应该是可显示的),而byte有多种256个字符,因此它可以包含更多信息。

base64是一种仅使用标准可打印字符在字符串中表示二进制数据的好方法。但是,它不是表示字符串数据的好方法,因为它需要比原始字符串更多的字符。

Base64使用64个人类可读字符(64个字符=6位信息)表示由8位字节组成的输入字符串

你问题答案的关键是,它的编码工作在24位的块中,因此每24位或其分数产生4个字符的输出

16字节*8位=128位信息

128位/24位/块=5.333块

因此,最终输出将是6个块或24个字符


分数块用等号处理,等号表示后面的“空位”。在您的情况下,输出总是以“==”结尾。

我希望一个16字节的字符串会产生22个base64字符。如果您试图压缩文本,那么转换为base64肯定不是最好的方法。如果你想压缩文本,最好的选择之一就是GZip。你会得到非常高的压缩级别,而不需要大惊小怪。我所做的是加密一个字符串,然后作为返回的一部分,使用上面的代码将其转换为Base64。我的目标是使返回的字符串尽可能小。我从6个字符开始,它加密到16,然后Base64变成24。它越来越大:-(@Gabe:Most base64也会填充到4个字符的边界,比如如果输入字节长度不是3的干净倍数。好的,这就解释了。我想使用我编码的字符串作为www链接的一部分?转换为base64是我唯一可以这样做的方法吗?@Emily:你可以只填充字符串。这样你就可以将它放入URLAr中你在找UrlEncoding吗?看一看,我认为加密会产生不可显示的字符,在这种情况下UrlEncoding还能工作吗?我不知道为什么人们会记下你的答案。我理解你的意思,并解释了为什么它需要更多的空间。@Emily:base64字符串可以包含64个以上的字符,所以这是一个nswer的开头是错误的。base64字符只能有64个可能值中的1个,而(8位)字节可以有256个值中的1个。如果这是Ehsan的意思,那么答案中应该是什么。(p.s.不是downvoter)对不起,我的英语不好,我的意思是base64可以由64个字符组成。