有没有办法在不知道解码值的编码的情况下确定base64编码值的长度?

时间:2016-11-17 12:36:44

标签: c# encoding utf-8 base64

我有一个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是常用的,但我也不熟悉这个解决方案。我该怎么办呢?如果不首先知道值的编码,是否无法找到一般的解决方案?

3 个答案:

答案 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;

DEMO