0

byte[]UTF-8 エンコーディングでエンコードされた出力の長さを制限する必要があります。例えば。byte[]長さは以下でなければなりません1000最初に次のコードを書きました

            int maxValue = 1000;

            if (text.Length > maxValue)
                text = text.Substring(0, maxValue);
            var textInBytes = Encoding.UTF8.GetBytes(text);

1文字あたり1バイトであるため、文字列がASCII文字のみを使用している場合はうまく機能します。ただし、文字数がそれを超えると、1 文字あたり 2、3、または 6 バイトになることさえあります。これは、上記のコードの問題です。その問題を解決するために、私はこれを書きました。

            List<byte> textInBytesList = new List<byte>();
            char[] textInChars = text.ToCharArray();
            for (int a = 0; a < textInChars.Length; a++)
            {
                byte[] valueInBytes = Encoding.UTF8.GetBytes(textInChars, a, 1);
                if ((textInBytesList.Count + valueInBytes.Length) > maxValue)
                    break;

                textInBytesList.AddRange(valueInBytes);
            }

私はコードをテストしていませんが、私が望むように動作すると確信しています。しかし、私はそれが行われた方法が好きではありません.これを行うより良い方法はありますか? 私が行方不明の何か?または知らない?

ありがとうございました。

4

1 に答える 1

1

Stack Overflow での初めての投稿なので、お手柔らかに!このメソッドは、物事をかなり迅速に処理するはずです..

    public static byte[] GetBytes(string text, int maxArraySize, Encoding encoding) {
        if (string.IsNullOrEmpty(text)) return null;            

        int tail = Math.Min(text.Length, maxArraySize);
        int size = encoding.GetByteCount(text.Substring(0, tail));
        while (tail >= 0 && size > maxArraySize) {
            size -= encoding.GetByteCount(text.Substring(tail - 1, 1));
            --tail;
        }

        return encoding.GetBytes(text.Substring(0, tail));
    }

これはあなたがやっていることと似ていますが、リストのオーバーヘッドが追加されたり、毎回文字列の先頭から数えたりする必要はありません。文字列の反対側から始めます。もちろん、すべての文字が少なくとも 1 バイトでなければならないという前提があります。そのため、文字列を maxArraySize (または文字列の全長) よりも遠くまで反復処理を開始しても意味がありません。

次に、そのようにメソッドを呼び出すことができます..

        byte[] bytes = GetBytes(text, 1000, Encoding.UTF8);
于 2013-11-08T05:42:07.577 に答える