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

时间:2008-08-29 14:51:25

标签: c# .net arrays string truncate

我想将一个字符串放入一个字节数组中,但字符串可能太大而不适合。在它太大的情况下,我想尽可能多地将字符串放入数组中。有没有一种有效的方法可以找出适合的字符数?

5 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:2)

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

答案 2 :(得分:1)

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

Encoding.GetMaxByteCount(1);

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

转换那么多字符
public virtual int Encoding.GetBytes (
 string s,
 int charIndex,
 int charCount,
 byte[] bytes,
 int byteIndex
)

如果您想减少使用内存

Encoding.GetByteCount(string);

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

答案 3 :(得分:1)

.NET中的Encoding类有一个名为GetByteCount的方法,它可以接受字符串或char []。如果传入1个字符,它将告诉您在使用的任何编码中,该1个字符需要多少字节。

方法GetMaxByteCount速度更快,但它的最坏情况计算可能会返回比实际需要的数字更高的数字。

答案 4 :(得分:1)

Cookey,你的代码并不像你明显认为的那样做。在您的情况下预先分配字节缓冲区是纯粹的浪费,因为它不会被使用。相反,您的赋值会丢弃已分配的内存并重置arr引用以指向另一个缓冲区,因为Encoding.GetBytes返回一个新数组。