10

文字列をバイト配列に入れたいのですが、文字列が大きすぎて収まらない可能性があります。大きすぎる場合は、できるだけ多くの文字列を配列に入れたいと思います。いくつの文字が収まるかを知るための効率的な方法はありますか?

4

4 に答える 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

GetByteCount.NET の Encoding クラスには、文字列または char[] を受け取ることができるというメソッドがあります。1文字を渡すと、使用しているエンコーディングでその1文字に必要なバイト数がわかります。

この方法GetMaxByteCountは高速ですが、最悪の場合の計算を行うため、実際に必要な数値よりも高い数値が返される可能性があります。

于 2008-08-29T15:08:04.377 に答える