Question

Je voudrais mettre une chaîne en un tableau d'octets, mais la chaîne peut être trop gros pour rentrer.Dans le cas où il est trop grand, je voudrais mettre autant de la chaîne que possible dans le tableau.Est-il un moyen efficace pour trouver le nombre de caractères de la forme?

Était-ce utile?

La solution

Afin de tronquer une chaîne UTF8 tableau d'octets sans se fendre au milieu d'un personnage que j'ai utiliser:

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 chaîne retournée peuvent ensuite être transférés en toute sécurité à un tableau d'octets de longueur maxLength.

Autres conseils

Vous devriez être en utilisant le Codage de la classe pour faire votre conversion en tableau d'octets correct?Tous les coder les objets ont une méthode surchargée GetMaxCharCount, qui va vous donner "Le nombre maximum de caractères produite par le décodage, le nombre spécifié d'octets". Vous devriez être en mesure d'utiliser cette valeur pour la garniture de votre chaîne et de coder correctement il.

Moyen efficace serait de trouver combien (pessimiste) octets, vous aurez besoin par caractère avec

Encoding.GetMaxByteCount(1);

en divisant votre taille de la chaîne par le résultat, puis de les convertir que beaucoup de personnages avec des

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

Si vous souhaitez utiliser moins de mémoire utilisation

Encoding.GetByteCount(string);

mais qui est beaucoup plus lent méthode.

Le Codage de la classe dans .NET a une méthode appelée GetByteCount qui peut prendre dans une chaîne de caractères ou char[].Si vous passer dans 1 personnage, il vous dira combien d'octets sont nécessaires pour que 1 caractère dans n'importe quel encodage que vous utilisez.

La méthode GetMaxByteCount est plus rapide, mais il fait un pire des cas de calcul qui pourrait revenir à un nombre plus élevé que ce qui est réellement nécessaire.

Cookey, votre code ne fait pas ce que vous apparent pense qu'il n'.Pré-affectation de l'octet de la mémoire tampon dans votre cas est en pure perte, car il ne sera pas utilisé.Plutôt, votre mission gouttes de la mémoire allouée et réinitialise le arr référence à point à un autre tampon parce que Encoding.GetBytes renvoie un nouveau tableau.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top