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