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

10

我想把一个字符串放进一个字节数组中,但是这个字符串可能太大而无法容纳。当它太大时,我想尽可能多地将字符串放入数组中。有没有一种有效的方法可以找出有多少个字符能够适应?

4个回答

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

2
你应该使用Encoding类来正确地将文本转换为字节数组,所有的Encoding对象都有一个重写的方法GetMaxCharCount,它会给你“通过解码指定数量的字节所产生的最大字符数”。你可以使用这个值来修剪你的字符串并正确地进行编码。

如果限制是字节数,则此方法无效。(仅当限制为字符数时有效) - roim

1

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

Encoding.GetMaxByteCount(1);

然后将您的字符串大小除以结果,然后使用该数量的字符进行转换

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

如果你想使用更少的内存,请使用

Encoding.GetByteCount(string);

但那是一种更慢的方法。


1
在.NET中,编码类有一个名为GetByteCount的方法,它可以接受字符串或char[]。如果您传入1个字符,它将告诉您在使用的任何编码中需要多少字节来表示该1个字符。
方法GetMaxByteCount更快,但它进行最坏情况计算,可能返回比实际需要的更高的数字。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接