2010-11-29 10 views
8

Necesito tratar de estimar el tamaño DISK de una cadena de texto (que podría ser texto sin formato o una cadena codificada en Base64 para una imagen/audio/etc.) en JavaScript. No estoy seguro de cómo estimar esto. Lo único que puedo encontrar en google es .length, así que pensé que quizás alguien en StackOverflow podría saber ...¿Cómo puedo estimar el tamaño del disco de una cadena con JavaScript?

La razón por la que necesito saber es que tengo un script localStorage que necesita (o le encantaría tener) la capacidad de verifica si un usuario está alcanzando su cuota de 5MB (o 10MB en IE) y pídele que aumente el tamaño máximo para el dominio. Por lo tanto, si un usuario acierta, digamos, 4.5MBs de datos con

Se acerca el límite de datos de 5 MB de su navegador. Por favor, aumentar su máximo de datos por ... [instrucciones sobre aumentarla para el navegador]

+1

No estoy seguro de cuál es tu pregunta. ¿Puedes reformular? Y: ¿Por qué no pruebas lo que has encontrado? – jwueller

+0

@elusive; Porque la longitud de una cadena es diferente al espacio en disco que ocupa. –

+0

¡Uy! Lo siento, olvidé agregar la palabra clave allí ... lo agregué ahora en mayúsculas y cursiva para que nadie lo omita. Me olvidé por completo de agregar que :( –

Respuesta

2

No va a ser exactos, pero se puede contar el número de bytes en una cadena para obtener una estimación aproximada.

function bytes(string) { 
    var escaped_string = encodeURI(string); 
    if (escaped_string.indexOf("%") != -1) { 
     var count = escaped_string.split("%").length - 1; 
     count = count == 0 ? 1 : count; 
     count = count + (escaped_string.length - (count * 3)); 
    } 
    else { 
     count = escaped_string.length; 
    }

return count; 

}

var mystring = 'TA'; Alerta (bytes (mystring));

2

Se va a depender de su codificación de caracteres. Si usa codificación ASCII, va a ser str.length bytes. Si usa UTF-16, será (str.length * 2) bytes. Si usa UTF-8, dependerá de los caracteres en la cadena. (Algunos caracteres solo tomarán 1 byte, pero otros podrían tomar hasta 4 bytes). Si se trata de datos codificados en Base64, los caracteres están todos dentro del rango ASCII y, por lo tanto, ocuparían str.length bytes en el disco. Si decodifica primero y guarda como binario, tomaría (str.length * 3/4) bytes. (Con base 64, 3 bytes codificados se convierten en 4 bytes codificados.)

BTW - Si usted no ha leído El Absoluto mínimo Cada desarrollador de software de Joel Spolsky absolutamente, positivamente debe saber acerca de Unicode y juegos de caracteres (Sin excusas!) , deberías hacerlo inmediatamente.

http://www.joelonsoftware.com/articles/Unicode.html

ACTUALIZACIÓN: Si está utilizando localStorage, asumo que usted está familiarizado con window.localStorage.length, aunque esto sólo indica cuánto se ha utilizado, no es si sus nuevos datos caben . También recomendaría encarecidamente leer Sumérgete en HTML5, especialmente el apartado de almacenamiento:

http://diveintohtml5.ep.io/storage.html

A menos que algo ha cambiado desde su escritura, no estoy seguro de lo que puede hacer como localStorage se limita a 5 MB por dominio sin posibilidad de que el usuario lo incremente.

+0

¡Lectura ahora, gracias! –

0

Si está hablando de uso de memoria, entonces no. No hay forma de determinar de forma confiable la memoria utilizada (al menos implementación-independientemente), ya que esto no es parte de la especificación ECMAScript. Depende de la codificación de tu personaje.

+0

No uso de memoria, lo siento, quise decir el tamaño del disco SI se guardó en un disco. He actualizado mi pregunta con más detalles. –

0

Depende de los datos en su cadena y la forma en que se almacena. Si su cadena codificada en Base64 se almacena como una cadena codificada en Base64, la longitud es la misma que el tamaño en el disco. Si no es así, hay que decodificar

he encontrado una solución (aunque parece un poco repulsivo) here

function checkLength() { 
    var countMe = document.getElementById("someText").value 
    var escapedStr = encodeURI(countMe) 
    if (escapedStr.indexOf("%") != -1) { 
     var count = escapedStr.split("%").length - 1 
     if (count == 0) count++ //perverse case; can't happen with real UTF-8 
     var tmp = escapedStr.length - (count * 3) 
     count = count + tmp 
    } else { 
     count = escapedStr.length 
    } 
    alert(escapedStr + ": size is " + count) 
} 
0

puede contar el número de bytes en una cadena mediante esta sencilla y precisa manera

var head = 'data:image/png;base64,'; 
var imgFileSize = Math.round((string.length - head.length)*3/4) ; 

console.log("size is ",imgFileSize); 
Cuestiones relacionadas