是否有一种方法可以在不知道解码值的编码的情况下确定base64编码值的长度?

本文关键字:情况下 编码 base64 编码值 解码 不知道 一种 方法 是否 | 更新日期: 2023-09-27 18:18:18

我有一个base64编码的值,我想通过使用这个值来知道解码值的长度,而不知道解码值的编码。

例如,"foo"的64进制编码值为Zm9v。当我像这样解码时:

var bytes = Convert.FromBase64String("Zm9v");

我得到一个有三个字节的数组。在这种情况下,我可以很容易地确定长度为3,但假设我们有"ü"作为"w7w="在64进制下的值:

// length = 2
var bytes = Convert.FromBase64String("w7w=");

字节数组的长度是2,所以第一个解决方案失败了,我想到的另一个选项是使用UTF8编码从字节中获取字符串,然后获得长度:

var lenght = Encoding.UTF8.GetString(bytes).Lenght;

我认为这将工作作为UTF8是常用的,但再次我对这个解决方案也不舒服。我该怎么做呢?在不知道值的编码的情况下,是否不可能找到一个通用的解决方案?

是否有一种方法可以在不知道解码值的编码的情况下确定base64编码值的长度?

如果没有编码,则无法从字节数组中知道字符串的长度。一个1000字节的BLOB可以是一个500字符的Unicode字符串,也可以是一个1000字符的ASCII字符串。

这里有两个问题,一个是容易的,另一个(一般情况下)是不可能的。

比较简单的方法是获取base64字符串编码的字节数。通过查看base64字符串中的字符数以及末尾有多少个=字符,您可以在不实际执行解码的情况下做到这一点。

一般不可能的方法是获得由任意字节序列编码的字符数。我之所以说一般不可能,是因为字符的数量取决于编码,而正确地猜测编码总是不可能的。这个问题有时被称为记事本文件编码问题,Raymond Chen在那里解释得比我好得多,尽管我将摘录:

例如,考虑这个文件:

D0 AE

根据所采用的编码,得到的结果非常不同结果。

  • 如果您假设8位ANSI(代码页1252),那么该文件由两个字符U+00D0 U+00AE或"Ю"组成。当然这看起来很奇怪,但也许它是单词VATNIЮ的一部分,可能是冰岛酒店名称

  • 如果使用UTF-8,则文件由单个西里尔字符U+042E或"Ю"组成。

  • 如果您假设Unicode大端序,则该文件由韩文音节U+ do0ae或"킮"组成。

  • 如果假设Unicode为小端编码,则该文件由韩文音节U+AED0或"껐"组成。

不获取字节长度,而是将其转换为字符串,然后获取字符串的长度:

var bytes = Convert.FromBase64String("w7w=");
int length = Encoding.UTF8.GetString(bytes).Length;

相关文章: