Pregunta

Me gustaría poner una cadena en una matriz de bytes, pero la cadena puede ser demasiado grande para caber.En el caso de que es demasiado grande, me gustaría poner tanto de la cadena como sea posible en la matriz.Es allí una manera eficiente, para saber cuántos caracteres se ajuste?

¿Fue útil?

Solución

Con el fin de truncar una cadena a un UTF8 matriz de bytes sin dividir en medio de un personaje que uso este:

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 cadena devuelta luego puede ser segura transferidos a una matriz de bytes de longitud maxLength.

Otros consejos

Usted debe utilizar la Codificación de la clase para hacer su conversión a la matriz de bytes correcta?Todos Codificación de los objetos tienen un método anulado GetMaxCharCount, que le dará "El máximo número de caracteres producidos por la decodificación del número especificado de bytes". Usted debe ser capaz de utilizar este valor para recortar su cadena y codificar correctamente la misma.

Manera eficiente sería encontrar cuánto (pesimista) bytes tendrá por carácter con

Encoding.GetMaxByteCount(1);

a continuación, dividiendo el tamaño de la cadena por el resultado, luego de la conversión que tanto los personajes con

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

Si desea utilizar el menor uso de memoria

Encoding.GetByteCount(string);

pero que es un método más lento.

La Codificación de la clase .NET tiene un método llamado GetByteCount que se puede tomar en un string o char[].Si pasa en 1 personaje, le dirá cuántos bytes se necesitan para que el 1 de caracteres en cualquier codificación que usted está utilizando.

El método GetMaxByteCount es más rápido, pero no es el peor caso de un cálculo que podría regresar a un mayor número de lo que es realmente necesario.

Cookey, el código no hace lo que aparente creo que sí.Pre-asignación de los bytes del búfer en su caso, es pura pérdida, porque no va a ser utilizado.En su lugar, la asignación de las gotas de la memoria asignada y restablece el arr se refiere al punto a otro buffer porque Encoding.GetBytes devuelve una nueva matriz.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top