文字列をバイト配列に入れたいのですが、文字列が大きすぎて収まらない可能性があります。大きすぎる場合は、できるだけ多くの文字列を配列に入れたいと思います。どのように多くの文字が収まるかを調べる効率的な方法はありますか?私はこれを使用する文字の途中で分割することなく、UTF8バイト配列に文字列を切り捨てるためにC#でバイトに変換中に文字列を切り詰めるにはどうすればよいですか?
8
A
答えて
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があります。これは、「指定されたバイト数をデコードすることによって生成される最大文字数」になります。この値を使用して文字列をトリミングし、適切にエンコードする必要があります。
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
参照を別のバッファを指すようにリセットします。
関連する問題
- 1. ソル文字列フィールドを10文字に切り詰めるにはどうすればよいですか?
- 2. 文字列をN文字以下で切り詰めるにはどうすればよいですか?
- 3. C++/Arduino:文字列/文字配列をバイトに変換するにはどうすればよいですか?
- 4. C#で文字列をバイト配列に変換するにはどうすればよいですか?
- 5. C#で文字列をPascalCase文字列に変換するにはどうすればよいですか?
- 6. バイト配列を文字列に変換するにはどうすればよいですか?
- 7. Javascript:decバイト配列オブジェクトを16進文字列に変換するにはどうすればよいですか?
- 8. UTF-8文字列をDartのバイト配列に変換するにはどうすればよいですか?
- 9. Goでuint16を2バイト文字列に変換するにはどうすればよいですか?
- 10. リストを切り詰めるにはどうすればいいですか?
- 11. コンテナに収まるように文字列を切り詰めるには?
- 12. カンマ区切り文字列または/ n区切り文字列をjqueryのリストに変換するにはどうすればよいですか?
- 13. PHPでUTF8文字列を切り詰めるには?
- 14. エリクサーで文字列を切り詰めるには?
- 15. C#で文字列を文例に変換するにはどうすればよいですか?
- 16. C++でchar配列を文字列に変換するにはどうすればよいですか?
- 17. C#で文字列を変数名に変換するにはどうすればよいですか?
- 18. Python:文字列分割に区切り文字を含めるにはどうすればいいですか?
- 19. JSFで文字列を切り詰めるにはどうしたらいいですか?
- 20. PHPで文字列を日付に変換するにはどうすればよいですか? C#ので
- 21. C++で最初の文字を大文字に変換するにはどうすればよいですか?
- 22. C#IP範囲を文字列配列に変換するにはどうすればよいですか?
- 23. 文字列を文字配列に変換するにはどうすればよいですか?
- 24. PHP文字列値をアンドロイド文字列値に変換するにはどうすればよいですか?
- 25. C#で特定の文字列[index]をintに変換するにはどうすればよいですか?
- 26. 大量の文字列をC++で整数に変換するにはどうすればよいですか?
- 27. Cで文字列をdouble値に変換するにはどうすればよいですか?
- 28. C#でncharを文字列に変換するにはどうすればよいですか?
- 29. IOrderedEnumerable <char>をC#で文字列に変換するにはどうすればよいですか?
- 30. Silverlight 4:bmpバイト配列をpngバイト配列に変換するにはどうすればよいですか?
制限がバイト数の場合、これは機能しません。 (制限が文字数の場合のみ) – roim