我有一个base 64编码值,我想通过使用这个值来知道解码值的长度,而不知道解码值的编码。
例如,“foo”的base 64编码值为 Zm9v 。当我像这样解码时:
var bytes = Convert.FromBase64String("Zm9v");
我得到一个有三个字节的数组。在这种情况下,我可以很容易地将长度确定为3,但是假设我们有“ü”作为基数64中“w7w =”的值:
// length = 2
var bytes = Convert.FromBase64String("w7w=");
字节数组的长度为2
,因此第一个解决方案失败,我想到的另一个选项是使用UTF8
编码从字节中获取字符串然后得到长度:
var lenght = Encoding.UTF8.GetString(bytes).Lenght;
我认为这会有效,因为UTF8
是常用的,但我也不熟悉这个解决方案。我该怎么办呢?如果不首先知道值的编码,是否无法找到一般的解决方案?
答案 0 :(得分:2)
如果没有编码,则无法知道字节数组中字符串的长度。 1000字节的BLOB可能是500字符的Unicode或1000字符的ASCII字符串。没有编码,你永远不会知道。
答案 1 :(得分:1)
这里有两个问题,一个是容易的,一个是(在一般情况下)不可能的。
简单的方法是获取base64字符串编码的字节数。您可以通过查看base64字符串中的字符数以及最后有多少=
个字符来实际执行解码。
通常不可能的是获得由任意字节序列编码的字符数。我说一般不可能,因为字符的数量取决于编码,并且正确猜测编码,总是不可能。这个问题有时被称为the Notepad file encoding problem,而Raymond Chen在那里解释得比我好得多,尽管我会摘录:
例如,请考虑以下文件:
D0 AE
根据您假设的编码,您会变得非常不同 结果
如果您假设8位ANSI(代码页1252),则该文件由两个字符U + 00D0 U + 00AE或“Ю”组成。当然这看起来 很奇怪,但也许这可能是VATNIЮ这个词的一部分 冰岛酒店的名称。
如果您假设为UTF-8,则该文件由单个西里尔字符U + 042E或“Ю”组成。
如果您假设使用Unicode big-endian,则该文件包含韩语Hangul音节U + D0AE或“킮”。
如果您假设使用Unicode little-endian,则该文件由韩语Hangul音节U + AED0或“껐”组成。
答案 2 :(得分:0)
不是获取字节长度,而是将其转换为字符串,然后获取字符串的长度:
var bytes = Convert.FromBase64String("w7w=");
int length = Encoding.UTF8.GetString(bytes).Length;