Dane binarne w łańcuchu JSON. Coś lepszego niż Base64


613

Formacie JSON natywnie nie obsługuje dane binarne. Dane binarne muszą być poprzedzone znakami ucieczki, aby można je było umieścić w elemencie łańcuchowym (tj. Zero lub więcej znaków Unicode w podwójnych cudzysłowach przy użyciu znaków ucieczki odwrotnego ukośnika) w JSON.

Oczywistą metodą na ucieczkę danych binarnych jest użycie Base64. Jednak Base64 ma wysoki narzut przetwarzania. Rozszerza również 3 bajty na 4 znaki, co prowadzi do zwiększenia rozmiaru danych o około 33%.

Jednym z przypadków użycia jest wersja v0.8 specyfikacji interfejsu API pamięci masowej w chmurze CDMI . Obiekty danych tworzysz za pomocą usługi REST-Webservice za pomocą JSON, np

PUT /MyContainer/BinaryObject HTTP/1.1
Host: cloud.example.com
Accept: application/vnd.org.snia.cdmi.dataobject+json
Content-Type: application/vnd.org.snia.cdmi.dataobject+json
X-CDMI-Specification-Version: 1.0
{
    "mimetype" : "application/octet-stream",
    "metadata" : [ ],
    "value" :   "TWFuIGlzIGRpc3Rpbmd1aXNoZWQsIG5vdCBvbmx5IGJ5IGhpcyByZWFzb24sIGJ1dCBieSB0aGlz
    IHNpbmd1bGFyIHBhc3Npb24gZnJvbSBvdGhlciBhbmltYWxzLCB3aGljaCBpcyBhIGx1c3Qgb2Yg
    dGhlIG1pbmQsIHRoYXQgYnkgYSBwZXJzZXZlcmFuY2Ugb2YgZGVsaWdodCBpbiB0aGUgY29udGlu
    dWVkIGFuZCBpbmRlZmF0aWdhYmxlIGdlbmVyYXRpb24gb2Yga25vd2xlZGdlLCBleGNlZWRzIHRo
    ZSBzaG9ydCB2ZWhlbWVuY2Ugb2YgYW55IGNhcm5hbCBwbGVhc3VyZS4=",
}

Czy istnieją lepsze sposoby i standardowe metody kodowania danych binarnych w ciągach JSON?


30
Do przesłania: robisz to tylko raz, więc nie jest to taka wielka sprawa. Do pobrania możesz być zaskoczony, jak dobrze kompresuje base64 pod gzip , więc jeśli masz włączoną gzip na swoim serwerze, prawdopodobnie również nie masz nic przeciwko.
cloudfeet

2
Innym godnym rozwiązaniem msgpack.org dla hardcorowych frajerów: github.com/msgpack/msgpack/blob/master/spec.md
nicolallias

2
@cloudfeet, raz na użytkownika na akcję . Bardzo duży interes.
Pacerier

2
Zauważ, że każdy znak ma zwykle 2 bajty pamięci . Zatem base64 może dać + 33% (4/3) narzutu na drut, ale umieszczenie tych danych na kablu, odzyskanie go i wykorzystanie, wymagałoby + 166% (8/3) narzutu . Przykład: jeśli łańcuch JavaScript ma maksymalną długość 100 000 znaków, możesz reprezentować tylko 37,5 000 bajtów danych przy użyciu base64, a nie 75 000 bajtów danych. Liczby te mogą stanowić wąskie gardło w wielu częściach aplikacji, np. JSON.parseItp. ......
Pacerier

5
@Pacerier „zwykle 2 bajty pamięci [na znak]” nie jest dokładny. Na przykład v8 ma ciągi OneByte i TwoByte. Dwubajtowe łańcuchy są używane tylko tam, gdzie to konieczne, aby uniknąć groteskowego zużycia pamięci. Base64 można kodować za pomocą ciągów jednobajtowych.
ZachB

Odpowiedzi:


459

Istnieje 94 znaków Unicode, które mogą być reprezentowane jako jeden bajt zgodnie ze specyfikacją JSON (jeśli twój JSON jest przesyłany jako UTF-8). Mając to na uwadze, myślę, że najlepszym, co możesz zrobić w przestrzeni, jest base85, który reprezentuje cztery bajty jako pięć znaków. Jest to jednak tylko 7% poprawa w stosunku do base64, obliczenia są droższe, a implementacje są mniej powszechne niż w przypadku base64, więc prawdopodobnie nie jest to wygrana.

Możesz także po prostu zamapować każdy bajt wejściowy na odpowiedni znak w U + 0000-U + 00FF, a następnie wykonać minimalne kodowanie wymagane przez standard JSON, aby przekazać te znaki; zaletą jest to, że wymagane dekodowanie jest zero poza wbudowanymi funkcjami, ale wydajność przestrzeni jest zła - zwiększenie o 105% (jeśli wszystkie bajty wejściowe są jednakowo prawdopodobne) w porównaniu z 25% dla base85 lub 33% dla base64.

Ostateczny werdykt: moim zdaniem base64 wygrywa, ponieważ jest to powszechne, łatwe i niezbyt złe , aby uzasadnić zamianę.

Zobacz także: Base91 i Base122


5
Poczekaj, jak zwykły bajt podczas kodowania znaków cudzysłowu jest rozszerzany o 105%, a base64 tylko o 33%? Czy base64 nie jest 133%?
jjxtra

17
Base91 jest złym pomysłem dla JSON, ponieważ zawiera cytat w alfabecie. W najgorszym przypadku (wyjście wszystkich cytatów) po kodowaniu JSON jest to 245% pierwotnego ładunku.
jarnoh

25
Python 3.4 obejmuje base64.b85encode()i b85decode()teraz. Prosty pomiar czasu kodowania + dekodowania pokazuje, że b85 jest ponad 13 razy wolniejszy niż b64. Mamy więc wygraną o 7%, ale utratę wydajności o 1300%.
Pieter Ennes,

3
@hobbs JSON stwierdza, że ​​znaki sterujące muszą być poprzedzane znakami ucieczki. RFC20 sekcja 5.2 definiuje DELsię jako znak kontrolny.
Tino,

2
@Tino ECMA-404 wymienia w szczególności znaki, które należy uciec: podwójny cudzysłów U + 0022, odwrotny ukośnik U + 005C i „znaki sterujące U + 0000 do U + 001F”.
hobbs

249

Natknąłem się na ten sam problem i pomyślałem, że podzielę się rozwiązaniem: dane wieloczęściowe / dane.

Wysyłając wieloczęściowy formularz, najpierw wysyłasz jako ciąg swoje meta-dane JSON , a następnie osobno wysyłasz jako nieprzetworzone pliki binarne (obraz (y), WAV itp.) Indeksowane według nazwy Dyspozycyjności .

Oto fajny samouczek, jak to zrobić w obj-c, a oto artykuł na blogu, który wyjaśnia, w jaki sposób podzielić dane ciągów na granice formularza i oddzielić je od danych binarnych.

Jedyne, co naprawdę musisz zrobić, to po stronie serwera; będziesz musiał przechwycić swoje metadane, które powinny odpowiednio odnosić się do danych binarnych POST (przy użyciu granicy dyspozycji treści).

To prawda, że ​​wymaga dodatkowej pracy po stronie serwera, ale jeśli wysyłasz wiele obrazów lub dużych obrazów, warto. Połącz to z kompresją gzip, jeśli chcesz.

IMHO wysyłanie danych zakodowanych w base64 to włamanie; dane wieloczęściowe / formularze RFC zostały utworzone dla takich problemów jak: wysyłanie danych binarnych w połączeniu z tekstem lub metadanymi.


4
Nawiasem mówiąc, interfejs API Dysku Google robi to w następujący sposób: developers.google.com/drive/v2/reference/files/update#examples
Mathias Conradt

2
Dlaczego ta odpowiedź jest tak niska, gdy używa natywnych funkcji zamiast próbować wycisnąć okrągły (binarny) kołek w kwadratowy otwór (ASCII)? ...
Mark K Cowan

5
wysyłanie danych zakodowanych w base64 to hack, podobnie jak przesyłanie danych wieloczęściowych / formularzy. Nawet artykuł w blogu, który podlinkowałeś, czyta to, że korzystając z danych wieloczęściowych / formularzy typu treści stwierdzasz, że to, co wysyłasz, jest w rzeczywistości formularzem. Ale to nie jest. więc myślę, że włamanie do base64 jest nie tylko łatwiejsze do wdrożenia, ale także bardziej niezawodne. Widziałem niektóre biblioteki (na przykład dla Pythona), w których typ zawartości danych wieloczęściowych / formularzy jest na stałe zapisany.
t3chb0t

4
@ t3chb0t Nośnik wieloczęściowy / forma-danych narodził się do transportu danych formularza, ale dziś jest szeroko stosowany poza światem HTTP / HTML, w szczególności do kodowania treści wiadomości e-mail. Dzisiaj jest proponowany jako ogólna składnia kodowania. tools.ietf.org/html/rfc7578
lorenzo

3
@MarkKCowan Prawdopodobnie, ponieważ chociaż jest to pomocne w celu pytania, nie odpowiada na zadane pytanie, co w rzeczywistości oznacza „Niskie narzuty kodowania binarnego na tekst do użycia w JSON”, ale ta odpowiedź całkowicie porzuca JSON.
Chinoto Vokro

34

Problem z UTF-8 polega na tym, że nie jest to najbardziej efektywne pod względem miejsca kodowanie. Ponadto niektóre losowe binarne sekwencje bajtów mają nieprawidłowe kodowanie UTF-8. Dlatego nie można po prostu interpretować losowej sekwencji bajtów binarnych jako niektórych danych UTF-8, ponieważ będzie to nieprawidłowe kodowanie UTF-8. Zaletą tego ograniczenia kodowania UTF-8 jest to, że sprawia, że ​​jest on solidny i umożliwia lokalizowanie wielobajtowych znaków rozpoczynających i kończących każdy bajt, na który zaczniemy patrzeć.

W konsekwencji, jeśli kodowanie wartości bajtu w zakresie [0..127] wymagałoby tylko jednego bajtu w kodowaniu UTF-8, kodowanie wartości bajtu w zakresie [128..255] wymagałoby 2 bajtów! Gorsze niż to. W JSON, znaki kontrolne, „i \ nie mogą pojawiać się w ciągu znaków. Dane binarne wymagałyby pewnej transformacji, aby były poprawnie zakodowane.

Pokazać. Jeśli przyjmiemy równomiernie rozłożone losowe wartości bajtów w naszych danych binarnych, wówczas średnio połowa bajtów będzie zakodowana w jednym bajcie, a druga połowa w dwóch bajtach. Dane binarne zakodowane w UTF-8 miałyby 150% początkowego rozmiaru.

Kodowanie Base64 rośnie tylko do 133% początkowego rozmiaru. Tak więc kodowanie Base64 jest bardziej wydajne.

Co powiesz na użycie innego kodowania Base? W UTF-8 kodowanie 128 wartości ASCII jest najbardziej wydajne pod względem miejsca. W 8 bitach możesz zapisać 7 bitów. Jeśli więc podzielimy dane binarne na 7-bitowe fragmenty, aby przechowywać je w każdym bajcie łańcucha zakodowanego w UTF-8, zakodowane dane wzrosną tylko do 114% początkowego rozmiaru. Lepsze niż Base64. Niestety nie możemy użyć tej prostej sztuczki, ponieważ JSON nie zezwala na niektóre znaki ASCII. 33 znaki kontrolne ASCII ([0..31] i 127) oraz „i \ muszą zostać wykluczone. Pozostawia nam to tylko 128-35 = 93 znaki.

Teoretycznie moglibyśmy zdefiniować kodowanie Base93, które zwiększyłoby zakodowany rozmiar do 8 / log2 (93) = 8 * log10 (2) / log10 (93) = 122%. Ale kodowanie Base93 nie byłoby tak wygodne jak kodowanie Base64. Base64 wymaga wycięcia wejściowej sekwencji bajtów na 6-bitowe porcje, dla których prosta operacja bitowa działa dobrze. Poza tym 133% to niewiele więcej niż 122%.

Dlatego niezależnie doszedłem do wspólnego wniosku, że Base64 jest rzeczywiście najlepszym wyborem do kodowania danych binarnych w JSON. Moja odpowiedź przedstawia uzasadnienie. Zgadzam się, że nie jest zbyt atrakcyjny z punktu widzenia wydajności, ale rozważam także korzyść z używania JSON z jego czytelną dla człowieka reprezentacją ciągów łatwą do manipulowania we wszystkich językach programowania.

Jeśli wydajność ma krytyczne znaczenie, należy uznać, że zastąpienie JSON powinno polegać wyłącznie na kodowaniu binarnym. Ale z JSON doszedłem do wniosku, że Base64 jest najlepszy.


Co o Base128 ale potem pozwalając serializer JSON uciec "i \ Myślę, że to rozsądne, aby oczekiwać, że użytkownik może korzystać z implementacji parsera JSON?.
jcalfee314

1
@ jcalfee314 niestety nie jest to możliwe, ponieważ znaki w kodzie ASCII poniżej 32 nie są dozwolone w ciągach JSON. Kodowania z bazą między 64 a 128 zostały już zdefiniowane, ale wymagane obliczenia są wyższe niż base64. Zwiększenie rozmiaru zakodowanego tekstu nie jest tego warte.
chmike

Jeśli ładowanie dużej liczby obrazów do base64 (powiedzmy 1000) lub ładowanie przez naprawdę wolne połączenie, czy base85 lub base93 kiedykolwiek zapłacą za zmniejszony ruch sieciowy (w / lub bez gzip)? Jestem ciekawy, czy istnieje punkt, w którym bardziej zwarte dane uzasadniałyby jedną z alternatywnych metod.
vol7ron

Podejrzewam, że szybkość obliczeń jest ważniejsza niż czas transmisji. Obrazy powinny oczywiście być wstępnie obliczone po stronie serwera. W każdym razie wniosek jest taki, że JSON jest zły dla danych binarnych.
chmike

Re „ Kodowanie Base64 rośnie tylko do 133% początkowego rozmiaru, więc kodowanie Base64 jest bardziej wydajne ”, jest to całkowicie błędne, ponieważ znaki zwykle mają 2 bajty. Zobacz opracowanie na stackoverflow.com/questions/1443158/...
Pacerier

34

BSON (Binary JSON) może działać dla Ciebie. http://en.wikipedia.org/wiki/BSON

Edycja: FYI. Json.net biblioteka .NET obsługuje czytanie i pisanie bson, jeśli szukasz trochę miłości po stronie serwera C #.


1
„W niektórych przypadkach BSON zużywa więcej miejsca niż JSON ze względu na prefiksy długości i jawne indeksy tablic.” en.wikipedia.org/wiki/BSON
Paweł Cioch

Dobra wiadomość: BSON natywnie obsługuje typy takie jak Binary, Datetime i kilka innych (szczególnie przydatne, jeśli używasz MongoDB). Zła wiadomość: jego kodowanie to bajty binarne ... więc nie jest odpowiedzią na PO. Byłoby to jednak przydatne w przypadku kanału obsługującego pliki binarne, takie jak komunikat RabbitMQ, komunikat ZeroMQ lub niestandardowe gniazdo TCP lub UDP.
Dan H

19

Jeśli masz do czynienia z problemami z przepustowością, spróbuj najpierw skompresować dane po stronie klienta, a następnie base64-it.

Dobrym przykładem takiej magii jest http://jszip.stuartk.co.uk/, a więcej dyskusji na ten temat znajduje się w implementacji JavaScript Gzip


2
oto implementacja zip JavaScript, która twierdzi lepszą wydajność: zip.js
Janus Troelsen

Zauważ, że możesz (i powinieneś) nadal kompresować po (zwykle poprzez Content-Encoding), ponieważ base64 dość dobrze kompresuje.
Mahmoud Al-Qudsi,

@ MahmoudAl-Qudsi miałeś na myśli, że masz base64 (zip (base64 (zip (data))))? Nie jestem pewien, czy dodanie kolejnego pliku zip, a następnie base64 go (aby móc wysłać go jako dane) jest dobrym pomysłem.
andrej

18

YEnc może pracować dla Ciebie:

http://en.wikipedia.org/wiki/Yenc

„yEnc to schemat kodowania binarnego na tekst do przesyłania plików binarnych w [tekście]. Zmniejsza to obciążenie w porównaniu z poprzednimi metodami kodowania opartymi na US-ASCII poprzez zastosowanie 8-bitowej rozszerzonej metody kodowania ASCII. Narzut yEnc jest często (jeśli każda wartość bajtu pojawia się średnio z tą samą częstotliwością średnio) wynoszącą zaledwie 1–2%, w porównaniu do narzutu 33–40% dla metod kodowania 6-bitowego, takich jak uuencode i Base64. ... Do 2003 r. YEnc stał się de facto standardem system kodowania plików binarnych w Usenecie. ”

Jednak YEnc jest kodowaniem 8-bitowym, więc przechowywanie go w ciągu JSON ma takie same problemy jak przechowywanie oryginalnych danych binarnych - robienie tego naiwnie oznacza około 100% rozszerzenie, co jest gorsze niż base64.


42
Ponieważ wydaje się, że wiele osób wciąż ogląda to pytanie, chciałbym wspomnieć, że nie sądzę, że YEnc naprawdę tu pomaga. yEnc jest kodowaniem 8-bitowym, więc przechowywanie go w ciągu JSON ma takie same problemy jak przechowywanie oryginalnych danych binarnych - robienie tego naiwnie oznacza około 100% rozszerzenie, co jest gorsze niż base64.
hobbs

W przypadkach, gdy użycie kodowania takiego jak YEnc z dużymi alfabetami z danymi JSON jest uważane za dopuszczalne, escapless może działać jako dobra alternatywa, zapewniając stały narzut znany z góry.
Ivan Kosarev

10

Chociaż prawdą jest, że base64 ma ~ 33% szybkości ekspansji, niekoniecznie jest prawdą, że narzut przetwarzania jest znacznie większy: to naprawdę zależy od używanej biblioteki / zestawu narzędzi JSON. Kodowanie i dekodowanie to proste, proste operacje, które można nawet zoptymalizować kodowaniem znaków wrt (ponieważ JSON obsługuje tylko UTF-8/16/32) - znaki base64 są zawsze jednobajtowe dla wpisów JSON String. Na przykład na platformie Java są biblioteki, które mogą wykonać to zadanie dość wydajnie, więc narzut wynika głównie z powiększonego rozmiaru.

Zgadzam się z dwiema wcześniejszymi odpowiedziami:

  • base64 jest prostym, powszechnie używanym standardem, więc jest mało prawdopodobne, aby znaleźć coś lepszego do użycia z JSON (base-85 jest używany przez PostScript itp .; ale korzyści są w najlepszym razie marginalne, gdy się nad tym zastanowić)
  • kompresja przed kodowaniem (i po dekodowaniu) może mieć sens, w zależności od używanych danych

10

Format uśmiechu

Kodowanie, dekodowanie i kompaktowanie jest bardzo szybkie

Porównanie prędkości (oparte na Javie, ale mimo to znaczące): https://github.com/eishay/jvm-serializers/wiki/

Jest to także rozszerzenie JSON, które pozwala pominąć kodowanie base64 dla tablic bajtów

Łańcuchy zakodowane w uśmiechu można zgzipować, gdy przestrzeń jest krytyczna


3
... a link nie działa. Ten wydaje się aktualny: github.com/FasterXML/smile-format-specification
Zero3

4

( Edytuj 7 lat później: Google Gears już nie ma. Zignoruj ​​tę odpowiedź).


Zespół Google Gears napotkał problem braku danych binarnych i próbował rozwiązać ten problem:

Interfejs API obiektów Blob

JavaScript ma wbudowany typ danych dla ciągów tekstowych, ale nic dla danych binarnych. Obiekt Blob próbuje rozwiązać to ograniczenie.

Może uda ci się to jakoś utkać.


Więc jaki jest status obiektów blob w Javascript i Json? Czy został upuszczony?
chmike

w3.org/TR/FileAPI/#blob-section Nie tak wydajne jak base64 dla przestrzeni, jeśli przewiniesz w dół, odkryjesz, że koduje za pomocą mapy utf8 (jako jedna z opcji pokazanych przez odpowiedź hobbsa). I bez wsparcia ze strony Jsona, o ile wiem
Daniele Cruciani

3

Ponieważ szukasz możliwości przekształcenia danych binarnych w format ściśle tekstowy i bardzo ograniczony, myślę, że narzut Base64 jest minimalny w porównaniu z wygodą, jakiej oczekujesz w JSON. Jeśli problem dotyczy mocy obliczeniowej i przepustowości, prawdopodobnie trzeba ponownie rozważyć formaty plików.


2

Wystarczy dodać do dyskusji punkt widzenia dotyczący zasobów i złożoności. Ponieważ wykonując PUT / POST i PATCH do przechowywania nowych zasobów i ich modyfikowania, należy pamiętać, że transfer zawartości jest dokładną reprezentacją treści, która jest przechowywana i która jest odbierana przez wykonanie operacji GET.

Wiadomość wieloczęściowa jest często używana jako wybawiciel, ale ze względu na prostotę i przy bardziej złożonych zadaniach wolę pomysł podania treści jako całości. Jest to oczywiste i proste.

I tak, JSON jest czymś paraliżującym, ale ostatecznie sam JSON jest pełny. A narzut związany z mapowaniem do BASE64 jest sposobem na mały.

Używając poprawnie komunikatów wieloczęściowych, należy albo zdemontować obiekt do wysłania, użyć ścieżki właściwości jako nazwy parametru dla automatycznej kombinacji, albo trzeba będzie utworzyć inny protokół / format, aby wyrazić ładunek.

Podobnie jak podejście BSON, nie jest to tak szeroko i łatwo wspierane, jak by się chciało.

Zasadniczo po prostu coś przeoczyliśmy, ale osadzanie danych binarnych, ponieważ base64 jest dobrze ugruntowane i jest gotowe, chyba że naprawdę zidentyfikujesz potrzebę wykonania prawdziwego transferu binarnego (co rzadko zdarza się tak często).


1

Kopię trochę więcej (podczas implementacji base128 ) i ujawniam , że kiedy wysyłamy znaki, których kody ascii są większe niż 128, wtedy przeglądarka (chrome) w rzeczywistości wysyła DWIE znaki (bajty) zamiast jednego :( . Powodem jest to, że JSON przez defaul użyj znaków utf8, dla których znaki o kodach ascii powyżej 127 są kodowane dwoma bajtami, o czym wspomniano w odpowiedzi chmike . Wykonałem test w ten sposób: wpisz chrome url bar chrome: // net-export / , zaznacz "Uwzględnij raw bytes ", rozpocznij przechwytywanie, wysyłaj żądania POST (używając fragmentu kodu u dołu), zatrzymaj przechwytywanie i zapisz plik json z danymi surowych żądań. Następnie przeglądamy ten plik json:

  • Możemy znaleźć nasze żądanie base64, znajdując ciąg, który 4142434445464748494a4b4c4d4ejest kodem szesnastkowym, ABCDEFGHIJKLMNi przekonamy się "byte_count": 639o tym.
  • Możemy znaleźć nasze zapytanie powyżej 127, znajdując ciąg znaków. C2BCC2BDC380C381C382C383C384C385C386C387C388C389C38AC38BSą to kody znaków w kodzie znaków UTP -hex ¼½ÀÁÂÃÄÅÆÇÈÉÊË(jednak kody szesnastkowe ascii tych znaków to c1c2c3c4c5c6c7c8c9cacbcccdce). Tak "byte_count": 703więc jest 64 bajtów dłuższy niż żądanie base64, ponieważ znaki o kodach ascii powyżej 127 są kodowane przez 2 bajty w żądaniu :(

W rzeczywistości nie mamy zysków z wysyłania znaków o kodach> 127 :(. W przypadku ciągów base64 nie obserwujemy takich negatywnych zachowań (prawdopodobnie również w przypadku base85 - nie sprawdzam) - jednak może być jakieś rozwiązanie tego problemu wysyłanie danych w binarnej części danych wieloczęściowych / formularzy POST opisanych w odpowiedzi Ælex (jednak zwykle w tym przypadku nie musimy wcale używać żadnego podstawowego kodowania ...).

Alternatywne podejście może polegać na odwzorowaniu dwubajtowej części danych na jeden poprawny znak utf8 przez kod za pomocą czegoś takiego jak base65280 / base65k, ale prawdopodobnie byłby mniej skuteczny niż base64 ze względu na specyfikację utf8 ...


0

Typ danych naprawdę dotyczy. Testowałem różne scenariusze wysyłania ładunku z zasobu RESTful. Do kodowania użyłem Base64 (Apache), a do kompresji GZIP (java.utils.zip. *). Ładunek zawiera informacje o filmie, obrazie i pliku audio. Skompresowałem i zakodowałem pliki obrazu i dźwięku, co drastycznie obniżyło wydajność. Kodowanie przed kompresją okazało się dobre. Treści obrazu i dźwięku zostały przesłane jako zakodowane i skompresowane bajty [].


0

Odnosić się: http://snia.org/sites/default/files/Multi-part%20MIME%20Extension%20v1.0g.pdf

Opisuje sposób przesyłania danych binarnych między klientem CDMI a serwerem za pomocą operacji „Typ zawartości CDMI” bez konieczności konwersji danych binarnych base64.

Jeśli możesz użyć operacji „Typ zawartości innej niż CDMI”, idealnie jest przenieść „dane” do / z obiektu. Metadane mogą być później dodane / pobrane do / z obiektu jako kolejna operacja typu zawartości CDMI.


-1

Moje rozwiązanie teraz, XHR2 używa ArrayBuffer. ArrayBuffer jako sekwencja binarna zawiera zawartość wieloczęściową, wideo, audio, grafikę, tekst itd. Z wieloma typami treści. Wszystko w jednej odpowiedzi.

W nowoczesnej przeglądarce mają DataView, StringView i Blob dla różnych komponentów. Zobacz także: http://rolfrost.de/video.html, aby uzyskać więcej informacji.



@Sharcoux wot ??
Mihail Malostanidis,

Serializacja tablicy bajtów w JSON jest czymś w rodzaju: [16, 2, 38, 89]co jest bardzo nieefektywne.
Sharcoux,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.