14

En primer lugar, soy consciente de esta pregunta:Acceso a datos binarios de Javascript, Ajax, IE: ¿se puede leer el cuerpo de respuesta de Javascript (no de VB)?

y, específicamente, mejor respuesta en el mismo, http://emilsblog.lerch.org/2009/07/javascript-hacks-using-xhr-to-load.html.

Para acceder a los datos binarios de Javascript usando Firefox (y versiones posteriores de Chrome que en realidad parecen funcionar también, no se sabe acerca de Opera). Hasta aquí todo bien. Pero todavía estoy esperando encontrar una manera de acceder a datos binarios con un IE moderno (idealmente IE 6, pero al menos IE 7+), sin usar VB. Se ha mencionado que XHR.messageBody no funcionaría (si contiene cero bytes), pero me preguntaba si esto podría haberse resuelto con las versiones más recientes; o si podría haber configuraciones alternativas que permitirían el acceso simple a datos binarios.

Caso de uso específico para mí es el acceso a los datos devueltos por un servicio web codificado utilizando un formato de transferencia de datos binarios (incluidas las combinaciones de bytes que no son legales en la codificación UTF-8).

Respuesta

3

Ok, he encontrado algunos clientes potenciales interesantes, aunque todavía no es una buena solución.

Una cosa obvia que probé fue jugar con codificaciones. Hay 2 cosas obvias que realmente debería funcionar:

  • Latin-1 (también conocido como ISO-8859-1): es la codificación de un solo byte, asignación uno a uno con Unicode. Así que teóricamente debería ser suficiente para declarar el tipo de contenido "text/plain; charset = ISO-8859-1" y obtener carácter por byte. ¡Ay, debido a la lógica idiota de los navegadores (y aún más mandato idiota por HTML 5!), Hay algo de transcodificación que cambia el rango de caracteres de control alto (códigos 128 - 159) de maneras extrañas. Aparentemente esto se debe a la suposición obligatoria de que la codificación es realmente Windows-1252 (¿por qué? Por algunas razones tontas ... pero es lo que es)
  • UCS-2 es una codificación de 2 bytes de longitud fija que precedió a UTF-17 ; y simplemente divide los códigos de caracteres de 16 bits en 2 bytes. Por desgracia, los navegadores no parecen apoyarlo.
  • UTF-16 podría funcionar, teóricamente, pero existe el problema de caracteres de par sustituto (0xD800 - 0xDFFF) que están reservados. Y si se incluyen pares de bytes que codifican estos caracteres, se produce corrupción.

Sin embargo, parece que la conversión para Latin-1 podría ser reversible, y si es así, apuesto a que podría usarla después de todo. Todas las mutaciones son de 1 byte (0x00 - 0xFF) en valores mayores que el byte, y no hay asignaciones ambiguas, al menos para Firefox. Si esto es cierto para otros navegadores, será posible volver a asignar los valores y eliminar los efectos nocivos de la transcodificación automática. Y eso funcionaría para múltiples navegadores, incluido IE (con la advertencia de necesitar algo especial para tratar con valores nulos).

Por último, algunos enlaces útiles para las conversiones de tipos de datos son:

2

Puede utilizar el JScript" VBArray "objeto de conseguir en estos bytes en IE (sin utilizar VBScript):

var data = new VBArray(xhr.responseBody).toArray();

+1

No, no creo que esto funciona. En mi experiencia, recibo una excepción al ejecutar esta línea; se queja de que responseBody no es un VBArray. La documentación para VBArray a la que vinculó dice * que el argumento safeArray debe haber obtenido un valor VBArray antes de pasarlo al constructor VBArray. Esto solo se puede hacer recuperando el valor de un ActiveX existente u otro objeto. * Pero el documento para responseBody http://msdn.microsoft.com/en-us/library/ms534368(VS.85).aspx no indica que es un safeArray. – Cheeso

3

Es posible con IE10, utilizando responseType = ArrayBuffer o burbuja. Sólo había que esperar unos años ...

http://msdn.microsoft.com/en-us/library/ie/br212474%28v=vs.94%29.aspx

http://msdn.microsoft.com/en-us/library/ie/hh673569%28v=vs.85%29.aspx

+0

¿Presumiblemente esto sería una solución solo de IE? Al menos sería un poco más limpio que otros métodos en IE, y como tal una mejora. – StaxMan

+0

Funciona en los otros navegadores recientes: https://developer.mozilla.org/en-US/docs/JavaScript/Typed_arrays/ArrayBuffer#Browser_compatibility – Damien

+0

¡Ah, genial! Gracias. – StaxMan

Cuestiones relacionadas