2016-06-28 75 views
0

比方说,我有245个字符的固定的字符串,例如如何从一个始终具有相同长度的字符串中获取最大字节数组长度?

v0iRfw0rBic4HlLIDmIm5MtLlbKvakb3Q2kXxMWssNctLgw445dre2boZG1a1kQ+xTUZWvry61QBmTykFEJii217m+BW7gEz3xlMxwXZnWwk2P6Pk1bcOkK3Nklbx2ckhtj/3jtj6Nc05XvgpiROJ/zPfztD0/gXnmCenre32BeyJ0Es2r4xwO8nWq3a+5MdaQ5NjEgr4bLg50DaxUoffQ1jLn/jIQ==` 

然后我在一个阵列变换字节使用

System.Text.Encoding.UTF8.GetBytes 

和阵列字节的长度为224
然后我生成另一个字符串,例如

PZ2+Sxx4SjyjzIA1qGlLz4ZFjkzzflb7pQfdoHfMFDlHwQ/uieDFOpWqnA5FFXYTwpOoOVXVWb9Hw6YUm6rF1rhG7eZaXEWmgFS2SeFItY+Qyt3jI9rkcWhPp8Y5sJ/q5MVV/iePuGVOArgBHhDe/g0Wg9DN4bLeYXt+CrR/bNC1zGQb8rZoABF4lSEh41NXcai4IizOHQMSd52rEa2wzpXoS1KswgxWroK/VUyRvH4oJpkMxkqj565gCHsZvO9jx8aLOZcBq66cYXOpDsi2gboeg+oUpAdLRGSjS7qQPfKTW42FBYPmJ3vrb2TW+g== 

但现在的阵列长度是320
所以我的问题是:我怎样才能确定一个字节数组的最大长度固定为245个字符的字符串?
这是我使用用于产生随机串

static class Utilities 
    { 
     static Random randomGenerator = new Random(); 
     internal static string GenerateRandomString(int length) 
     { 
      byte[] randomBytes = new byte[randomGenerator.Next(length)]; 
      randomGenerator.NextBytes(randomBytes); 
      return Convert.ToBase64String(randomBytes); 
     } 
    } 
+2

我很困惑你的问题。第一个字符串长度为224个字符,第二个长度为320个字符。你在哪里得到245号? – smarx

+0

第二个字符串比第一个字符串大。你究竟在问什么? – Groo

+0

所有这些字符串看起来都像base64编码数据。如果是这种情况,所有字符都在ASCII范围内。 –

回答

3

类按照RFC 3629

在UTF-8,从U + 0000..U + 10FFFF字符范围(UTF-16 可访问范围)使用1到4个八位字节的序列进行编码。

每UTF-8字符的字节的最大数目是4 ,所以你的字节数组的最大长度为4次245 980 =。 如果您使用的编码Byte Order Mark (BOM)你需要3个额外的字节

[...]的BOM 将始终显示为八位字节序列EF BB BF。

因此总共。

附加信息:

在您的例子,还转换的字节数组为Base64,它利用6个每字符位数,因此具有的4 * Math.Ceiling(Characters/3)的长度,或在您的情况 ASCII字符。

1

根据UTF8的设计,它是可扩展的。

https://en.wikipedia.org/wiki/UTF-8

从理论上讲,你没有的最大长度。

但是,当然,现实世界中的词语是有限的。

在实践中,字节长度被限制为字计数X 4.

245 chars => 980 bytes 

如果寻找一个固定长度编码,使用Encoding.Unicode

而且,Encoding提供了给出最大字节数的方法。

Encoding.UTF8.GetMaxByteCount(charCount: 245) 
Encoding.Unicode.GetMaxByteCount(charCount: 245) 
-1

简而言之,你不能。通用文本格式8(您使用),每个字符使用1,2,3或4个字节(如汤米说的),所以唯一的办法是遍历所有字符(GetMaxByteCount())并计算它。

也许,如果要继续使用基于64位字符串一样,你不并不需要UTF8,相反,你可以使用每个字符编码任何其他1个字节的ASCII与您共byte array size将是Length你串。