如何从始终具有相同长度的字符串中获取最大字节数组长度?

时间:2016-06-28 09:19:12

标签: c# arrays

假设我有一个带有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);
        }
    }

3 个答案:

答案 0 :(得分: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。

总共 983

其他信息:

在您的示例中,您还将字节数组转换为Base64,每个字符使用6位,因此长度为4 * Math.Ceiling(Characters/3),或者在您的情况下 1312 ASCII字符。< / p>

答案 1 :(得分: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)

答案 2 :(得分:-1)

简单地说,你不能。通用文本格式8(您使用),每个字符使用1,2,3或4个字节(如Tommy所说),因此唯一的方法是遍历所有字符(GetMaxByteCount())并计算它。

也许,如果你继续使用类似BASE64的字符串,你不需要UTF8,相反,你可以使用每个字符编码的任何其他1字节的ASCII,你的总byte array size将是你的字符串的Length