在C#中转换为字节时如何截断字符串?

时间:2020-03-05 18:44:58  来源:igfitidea点击:

我想将一个字符串放入字节数组,但是该字符串可能太大而无法容纳。如果它太大,我想将尽可能多的字符串放入数组中。有没有一种有效的方法来找出可以容纳多少个字符?

解决方案

回答

为了将字符串截断为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的字节数组。

回答

我们应该使用Encoding类来完成对字节数组的正确转换吗?所有Encoding对象都有一个重写的GetMaxCharCount方法,该方法将为我们提供"通过解码指定的字节数产生的最大字符数"。我们应该能够使用该值来修剪字符串并正确编码。

回答

一种有效的方法是查找每个字符需要多少(悲观地)字节

Encoding.GetMaxByteCount(1);

然后将字符串大小除以结果,然后用

public virtual int Encoding.GetBytes (
 string s,
 int charIndex,
 int charCount,
 byte[] bytes,
 int byteIndex
)

如果我们想使用更少的内存

Encoding.GetByteCount(string);

但这是一种慢得多的方法。

回答

.NET中的Encoding类具有一个名为" GetByteCount"的方法,该方法可以接收字符串或者char []。如果我们输入1个字符,它将告诉我们使用所使用的编码方式的1个字符需要多少字节。

方法GetMaxByteCount更快,但是会进行最坏的情况下的计算,返回的数字可能比实际需要的数字大。

回答

Cookey,代码并没有按照我们认为的做。在这种情况下,预分配字节缓冲区纯属浪费,因为将不使用它。相反,分配会丢弃已分配的内存并重置" arr"引用以指向另一个缓冲区,因为" Encoding.GetBytes"会返回一个新数组。