文字列をバイト配列に入れたいのですが、文字列が大きすぎて収まらない可能性があります。大きすぎる場合は、できるだけ多くの文字列を配列に入れたいと思います。いくつの文字が収まるかを知るための効率的な方法はありますか?
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
GetByteCount
.NET の Encoding クラスには、文字列または char[] を受け取ることができるというメソッドがあります。1文字を渡すと、使用しているエンコーディングでその1文字に必要なバイト数がわかります。
この方法GetMaxByteCount
は高速ですが、最悪の場合の計算を行うため、実際に必要な数値よりも高い数値が返される可能性があります。
于 2008-08-29T15:08:04.377 に答える