Domanda

Vorrei mettere una stringa in un array di byte, ma la stringa può essere troppo grande per entrare.Nel caso In cui è troppo grande, vorrei mettere più di una stringa in un array.C'è un modo efficace per scoprire quanti caratteri si adatta?

È stato utile?

Soluzione

Per troncare una stringa a una UTF8 matrice di byte senza dividerlo nel mezzo di un carattere io uso questo:

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

La stringa restituita possono poi essere trasferito in sicurezza un array di byte di lunghezza maxLength.

Altri suggerimenti

Si dovrebbe essere utilizzando il sistema di Codifica classe di conversione a matrice di byte in modo corretto?Tutti Codifica di oggetti che hanno un metodo sostituito GetMaxCharCount, che vi darà "Il numero massimo di caratteri prodotto dalla decodifica il numero di byte specificato." Si dovrebbe essere in grado di utilizzare questo valore per tagliare la corda e correttamente codificare.

Efficace sarebbe trovare quanto (pessimisticamente) byte è necessario per carattere con

Encoding.GetMaxByteCount(1);

poi dividere le dimensioni della stringa il risultato, poi la conversione di molto i personaggi con

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

Se si desidera utilizzare meno memoria di utilizzo

Encoding.GetByteCount(string);

ma questo è un altro metodo più lento.

La Codifica di classe .NET ha un metodo chiamato GetByteCount che si può prendere in una stringa o un char[].Se si passa in 1 carattere, vi dirà quanti byte sono necessari per il 1 carattere in qualsiasi codifica in uso.

Il metodo GetMaxByteCount è più veloce, ma non peggiore di calcolo che potrebbe restituire un numero superiore rispetto a quella effettivamente necessaria.

Cookey, il tuo codice non fare ciò che è apparente, credo di sì.Pre-allocare il buffer di byte nel tuo caso è puro spreco, perché non sarà utilizzato.Piuttosto, l'assegnazione gocce di memoria allocata e ripristina la arr riferimento al punto a un altro buffer, perché Encoding.GetBytes restituisce un nuovo array.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top