2008-08-29 2 views
8

文字列をバイト配列に入れたいのですが、文字列が大きすぎて収まらない可能性があります。大きすぎる場合は、できるだけ多くの文字列を配列に入れたいと思います。どのように多くの文字が収まるかを調べる効率的な方法はありますか?私はこれを使用する文字の途中で分割することなく、UTF8バイト配列に文字列を切り捨てるためにC#でバイトに変換中に文字列を切り詰めるにはどうすればよいですか?

答えて

5

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

バイト配列への変換を正しく行うには、エンコードクラスを使用する必要がありますか?すべてのエンコーディングオブジェクトには、オーバーライドされたメソッドGetMaxCharCountがあります。これは、「指定されたバイト数をデコードすることによって生成される最大文字数」になります。この値を使用して文字列をトリミングし、適切にエンコードする必要があります。

+0

制限がバイト数の場合、これは機能しません。 (制限が文字数の場合のみ) – roim

1

効率的な方法は、あなたがして

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

でそのくらいの文字を変換し、その後、その結果によって、あなたの文字列サイズを分割

Encoding.GetMaxByteCount(1); 

で文字ごとに必要になりますバイトをどのくらい(悲観的)発見されるだろうメモリ使用量を減らしたい場合は

Encoding.GetByteCount(string); 

はるかに遅い方法です。

1

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

メソッドGetMaxByteCountは高速ですが、実際に必要な数値よりも高い数値を返す最悪の計算方法です。

1

Cookey、あなたのコードは、あなたが明らかにそう思っていることをしません。あなたのケースでバイトバッファをあらかじめ割り当てることは、使用されないので、無駄です。代わりに、割り当てが割り当てられたメモリを削除し、Encoding.GetBytesが新しい配列を返すので、arr参照を別のバッファを指すようにリセットします。

関連する問題