Как я усекаю строку при преобразовании в байты в C#?

Решение Timmerman отлично работает при запуске кода, но если вы не хотите получать ошибки Undefined name при использовании pyflakes или аналогичного linter, вы можете использовать следующее:

try:
    import __builtin__
    input = getattr(__builtin__, 'raw_input')
except (ImportError, AttributeError):
    pass
9
задан skolima 13 August 2013 в 21:03
поделиться

4 ответа

Для усечения строки к массиву байтов 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.

5
ответ дан 4 December 2019 в 21:52
поделиться

Необходимо ли использовать класс Кодирования, чтобы сделать преобразование в корректный массив байтов? Все объекты Кодирования имеют переопределенный метод GetMaxCharCount, который даст Вам "Максимальное количество символов, произведенных путем декодирования конкретного количества байтов". Необходимо смочь использовать это значение, чтобы обрезать строку и правильно закодировать его.

2
ответ дан 4 December 2019 в 21:52
поделиться

Классу Кодирования в.NET назвали метод GetByteCount который может взять в строке или символе []. Если Вы передадите в 1 символе, то он скажет Вам, сколько байтов необходимо для того 1 символа в том, какой бы ни кодирование Вас использует.

Метод GetMaxByteCount быстрее, но это делает худшее вычисление случая, которое могло возвратить более высокое количество, чем на самом деле необходимо.

1
ответ дан 4 December 2019 в 21:52
поделиться

Эффективный путь нашел бы, с каким количеством (пессимистически) байты Вы будете нуждаться на символ

Encoding.GetMaxByteCount(1);

затем деление Вашего размера строки результатом, затем преобразование так многого изображают с

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

Если Вы хотите использовать меньше использования памяти

Encoding.GetByteCount(string);

но это - намного более медленный метод.

1
ответ дан 4 December 2019 в 21:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: