Comment puis-je tronquer une chaîne de caractères lors de la conversion d'octets en C#?
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?
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.