14

Przede wszystkim, jestem świadomy tego pytania:Uzyskiwanie dostępu do danych binarnych z Javascript, Ajax, IE: można odpowiedzi odczyty z JavaScript (nie VB)?

a konkretnie najlepszą odpowiedzią nim http://emilsblog.lerch.org/2009/07/javascript-hacks-using-xhr-to-load.html.

W ten sposób uzyskuję dostęp do danych binarnych z Javascript za pomocą przeglądarki Firefox (i późniejszych wersji Chrome, które również wydają się działać, nie znają Opery). Jak na razie dobrze. Ale nadal mam nadzieję znaleźć sposób na uzyskanie dostępu do danych binarnych za pomocą nowoczesnego IE (najlepiej IE 6, ale przynajmniej IE 7+), bez użycia VB. Zostało wspomniane, że XHR.messageBody nie działałoby (jeśli zawiera zero bajtów), ale zastanawiałem się, czy mogło to zostać rozwiązane w nowszych wersjach; lub jeśli mogą istnieć alternatywne ustawienia, które umożliwiłyby prosty dostęp do danych binarnych.

Szczególnym zastosowaniem jest dla mnie dostęp do danych zwracanych przez usługę internetową zakodowaną przy użyciu formatu binarnej transmisji danych (w tym kombinacje bajtów, które nie są legalne w kodowaniu UTF-8).

Odpowiedz

3

Ok, znalazłem kilka ciekawych tropów, chociaż nie jest to jeszcze całkiem dobre rozwiązanie.

Jedną z oczywistych rzeczy, którą próbowałem, była gra z kodowaniem. Istnieją 2 oczywistych rzeczy, które naprawdę powinny działać:

  • Latin-1 (aka ISO-8859-1): jest to kodowanie jednobajtowe, mapowanie jeden-na-jeden z Unicode. Tak więc teoretycznie powinno wystarczyć zadeklarowanie typu zawartości "text/plain, charset = ISO-8859-1" i otrzymanie znaku "per-byte". Niestety, z powodu idiotycznej logiki przeglądarek (i jeszcze bardziej idiotycznego mandatu za pomocą HTML 5!), Występuje pewne transkodowanie, które zmienia dziwny zakres znaków kontrolnych (kody 128 - 159). Najwyraźniej wynika to z obowiązkowego założenia, że ​​kodowanie naprawdę jest Windows-1252 (dlaczego? Z jakiegoś głupiego powodu ... ale tak właśnie jest)
  • UCS-2 to 2-bajtowe kodowanie o stałej długości, które istniało wcześniej niż UTF-17 ; i po prostu dzieli 16-bitowe kody znaków na 2 bajty. Niestety, przeglądarki nie obsługują go.
  • UTF-16 może działać teoretycznie, ale istnieje problem zastępczych znaków par (0xD800 - 0xDFFF), które są zarezerwowane. A jeśli dołączone są pary bajtów, które kodują te znaki, występuje korupcja.

Jednak wydaje się, że konwersja dla Latin-1 może być odwracalna, a jeśli tak, to założę, że mógłbym z niej skorzystać. Wszystkie mutacje są od 1 bajta (0x00 - 0xFF) do większych niż bajt wartości i nie ma żadnych niejednoznacznych mapowań przynajmniej dla Firefox. Jeśli ma to zastosowanie w przypadku innych przeglądarek, będzie można odwzorować wartości i usunąć złe efekty automatycznego transkodowania. A to działałoby wtedy dla wielu przeglądarek, w tym IE (z zastrzeżeniem, że potrzebujemy czegoś specjalnego, aby poradzić sobie z zerowymi wartościami).

Wreszcie Przydatne linki do konwersji typów danych są następujące:

2

Można użyć JScript" VBArray "obiekt, aby uzyskać w tych bajtów w IE (bez użycia VBScript):

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

+1

Nie, nie sądzę, że to działa. Z mojego doświadczenia wynika, że ​​podczas wykonywania tej linii otrzymuję wyjątek; narzeka, że ​​responseBody nie jest VBArray. Dokumentacja dla VBArray, która jest połączona z * argumentem safeArray, musiała uzyskać wartość VBArray przed przekazaniem do konstruktora VBArray. Można to zrobić tylko pobierając wartość z istniejącego ActiveX lub innego obiektu. * Ale dokument dla responseBody http://msdn.microsoft.com/en-us/library/ms534368(VS.85).aspx nie wskazuje że to jest bezpieczna tablica. – Cheeso

3

Jest to możliwe z IE10, używając responseType = arraybuffer lub blob. Wystarczy tylko musiał czekać kilka lat ...

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

Prawdopodobnie byłoby to rozwiązanie tylko IE? Przynajmniej byłby nieco czystszy niż inne metody w IE, i jako taka poprawa. – StaxMan

+0

Działa w innych najnowszych przeglądarkach: https://developer.mozilla.org/en-US/docs/JavaScript/Typed_arrays/ArrayBuffer#Browser_compatibility – Damien

+0

Ah, świetnie! Dziękuję Ci. – StaxMan

Powiązane problemy