Como faço para truncar uma seqüência de caracteres, enquanto a conversão de bytes em C#?

StackOverflow https://stackoverflow.com/questions/34395

Pergunta

Eu gostaria de colocar uma string em um array de bytes, mas a seqüência de caracteres podem ser grandes demais para caber.No caso em que é muito grande, eu gostaria de colocar quanto a maior string possível para a matriz.Existe uma maneira eficiente de descobrir quantos cabem caracteres?

Foi útil?

Solução

Para truncar uma seqüência de caracteres para um UTF8 matriz de bytes, sem dividi no meio de um personagem que eu use isso:

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);
}

A seqüência de caracteres retornada, em seguida, podem ser facilmente transferidos para uma matriz de bytes de comprimento maxLength.

Outras dicas

Você deve estar usando a classe de Codificação para fazer sua conversão para a matriz de bytes correcto?Todos os Codificação de objetos tem um método substituído GetMaxCharCount, que irá dar-lhe "O número máximo de caracteres produzido pela decodificação do número de bytes especificado." Você deve ser capaz de utilizar este valor para aparar a sua cadeia e devidamente codificá-lo.

Maneira eficiente seria encontrar o quanto (pessimistically) bytes, você vai precisar de cada personagem com

Encoding.GetMaxByteCount(1);

em seguida, dividir o tamanho da seqüência de caracteres com o resultado, em seguida, converter-se que muito caracteres com

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

Se você quiser usar menos uso de memória

Encoding.GetByteCount(string);

mas que é um método mais lento.

A Codificação de classe .NET tem um método chamado GetByteCount o que pode levar em uma string ou char[].Se você passar em 1 personagem, ele irá dizer-lhe quantos bytes são necessários para que 1 caractere em qualquer codificação que você está usando.

O método GetMaxByteCount é mais rápido, mas o pior caso de cálculo, que poderia retornar um número maior do que é realmente necessário.

Cookey, o seu código não fazer o que você aparente acho que não.Pré-alocar o buffer de bytes no seu caso é pura perda, porque ele não será usado.Ao invés, a sua atribuição gotas de memória alocada e redefine o arr referência para apontar para outro buffer, porque Encoding.GetBytes retorna uma nova matriz.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top