我想将一个字符串放入一个字节数组中,但该字符串可能太大而无法容纳。在它太大的情况下,我想将尽可能多的字符串放入数组中。有没有一种有效的方法来找出适合多少个字符?
TimK
问问题
3549 次
4 回答
6
为了将字符串截断为 UTF8 字节数组而不在字符中间拆分,我使用以下命令:
static string Truncate(string s, int maxLength) {
if (Encoding.UTF8.GetByteCount(s) <= maxLength)
return s;
var cs = s.ToCharArray();
int length = 0;
int i = 0;
while (i < cs.Length){
int charSize = 1;
if (i < (cs.Length - 1) && char.IsSurrogate(cs[i]))
charSize = 2;
int byteSize = Encoding.UTF8.GetByteCount(cs, i, charSize);
if ((byteSize + length) <= maxLength){
i = i + charSize;
length += byteSize;
}
else
break;
}
return s.Substring(0, i);
}
然后可以将返回的字符串安全地传输到长度为 maxLength 的字节数组。
于 2008-08-29T15:03:27.040 回答
2
您应该使用 Encoding 类来正确转换为字节数组吗?所有 Encoding 对象都有一个重写的方法 GetMaxCharCount,它将为您提供“解码指定字节数产生的最大字符数”。您应该能够使用此值来修剪您的字符串并对其进行正确编码。
于 2008-08-29T15:05:38.657 回答
1
有效的方法是找到每个字符需要多少(悲观)字节
Encoding.GetMaxByteCount(1);
然后将你的字符串大小除以结果,然后用
public virtual int Encoding.GetBytes (
string s,
int charIndex,
int charCount,
byte[] bytes,
int byteIndex
)
如果你想使用更少的内存使用
Encoding.GetByteCount(string);
但这是一种慢得多的方法。
于 2008-08-29T15:07:17.483 回答
1
.NET 中的 Encoding 类有一个名为的方法GetByteCount
,它可以接收字符串或 char[]。如果您传入 1 个字符,它将告诉您在使用哪种编码时,该 1 个字符需要多少字节。
该方法GetMaxByteCount
更快,但它会进行最坏情况的计算,这可能会返回比实际需要的数字更高的数字。
于 2008-08-29T15:08:04.377 回答