Dữ liệu nhị phân trong chuỗi JSON. Một cái gì đó tốt hơn Base64


614

Các định dạng JSON natively không hỗ trợ dữ liệu nhị phân. Dữ liệu nhị phân phải được thoát để có thể đặt nó vào một phần tử chuỗi (tức là 0 hoặc nhiều ký tự Unicode trong dấu ngoặc kép bằng cách sử dụng dấu gạch chéo ngược) trong JSON.

Một phương pháp rõ ràng để thoát dữ liệu nhị phân là sử dụng Base64. Tuy nhiên, Base64 có chi phí xử lý cao. Ngoài ra, nó mở rộng 3 byte thành 4 ký tự dẫn đến tăng kích thước dữ liệu lên khoảng 33%.

Một trường hợp sử dụng cho điều này là bản nháp v0.8 của đặc tả API lưu trữ đám mây CDMI . Bạn tạo các đối tượng dữ liệu thông qua REST-Webservice bằng JSON, vd

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=",
}

Có cách nào tốt hơn và phương pháp chuẩn để mã hóa dữ liệu nhị phân thành chuỗi JSON không?


30
Để tải lên: bạn chỉ thực hiện một lần, vì vậy nó không phải là vấn đề lớn. Để tải xuống, bạn có thể ngạc nhiên về việc cơ sở nén 64 như thế nào dưới gzip , vì vậy nếu bạn đã bật gzip trên máy chủ của mình thì có lẽ bạn cũng ổn.
đám mây

2
Một giải pháp xứng đáng khác là Spypack.org dành cho những người khó tính: github.com/msgpack/msgpack/blob/master/spec.md
nicolallias

2
@cloudfeet, Một lần cho mỗi người dùng mỗi hành động . Một thỏa thuận rất lớn.
Pacerier

2
Lưu ý rằng các ký tự thường là 2 byte bộ nhớ mỗi. Do đó, Base64 có thể cung cấp + 33% (4/3) chi phí trên dây, nhưng đặt dữ liệu đó lên dây, truy xuất và sử dụng nó, sẽ yêu cầu chi phí + 166% (8/3) . Trường hợp cụ thể: nếu một chuỗi Javascript có độ dài tối đa 100 nghìn ký tự, bạn chỉ có thể biểu thị 37,5k byte dữ liệu bằng cách sử dụng base64, không phải 75k byte dữ liệu. Những con số này có thể là một nút cổ chai trong nhiều phần của ứng dụng, JSON.parsev.v. ......
Pacerier 20/03/2017

5
@Pacerier "thường là 2 byte bộ nhớ [mỗi ký tự]" là không chính xác. v8 ví dụ có chuỗi OneByte và TwoByte. Chuỗi hai byte chỉ được sử dụng khi cần thiết để tránh tiêu thụ bộ nhớ kỳ cục. Base64 được mã hóa bằng các chuỗi một byte.
ZachB

Câu trả lời:


459

Có 94 ký tự Unicode có thể được biểu thị dưới dạng một byte theo thông số JSON (nếu JSON của bạn được truyền dưới dạng UTF-8). Với ý nghĩ đó, tôi nghĩ rằng điều tốt nhất bạn có thể làm không gian thông minh là cơ sở85 , đại diện cho bốn byte là năm ký tự. Tuy nhiên, đây chỉ là một cải tiến 7% so với Base64, nó đắt hơn để tính toán và việc triển khai ít phổ biến hơn so với Base64 nên có lẽ nó không phải là một chiến thắng.

Bạn cũng có thể chỉ cần ánh xạ mọi byte đầu vào thành ký tự tương ứng trong U + 0000-U + 00FF, sau đó thực hiện mã hóa tối thiểu theo tiêu chuẩn JSON để truyền các ký tự đó; lợi thế ở đây là giải mã được yêu cầu không vượt quá các hàm dựng sẵn, nhưng hiệu quả không gian rất tệ - mở rộng 105% (nếu tất cả các byte đầu vào đều có khả năng như nhau) so với 25% cho cơ sở85 hoặc 33% cho cơ sở64.

Phán quyết cuối cùng: theo tôi, cơ sở 64 chiến thắng với lý do nó phổ biến, dễ dàng và không đủ tệ để đảm bảo thay thế.

Xem thêm: Base91Base122


5
Đợi thế nào là chỉ sử dụng byte thực tế trong khi mã hóa các ký tự trích dẫn mở rộng 105% và base64 chỉ 33%? Không phải là cơ sở64 133%?
jjxtra

17
Base91 là ý tưởng tồi cho JSON, vì nó chứa trích dẫn trong bảng chữ cái. Trong trường hợp xấu nhất (tất cả đầu ra báo giá) sau khi mã hóa JSON, nó là 245% tải trọng ban đầu.
jarnoh

25
Python 3,4 bao gồm base64.b85encode()b85decode()bây giờ. Một phép đo thời gian mã hóa + giải mã đơn giản cho thấy b85 chậm hơn 13 lần so với b64. Vì vậy, chúng tôi có một chiến thắng kích thước 7%, nhưng mất hiệu suất 1300%.
Pieter Ennes

3
@hobbs JSON nói rằng các ký tự điều khiển phải được thoát. RFC20 phần 5.2 định nghĩa DELlà một ký tự điều khiển.
Tino

2
@Tino ECMA-404 liệt kê cụ thể các ký tự cần thoát: trích dẫn kép U + 0022, dấu gạch chéo ngược U + 005C và "các ký tự điều khiển U + 0000 đến U + 001F".
hobbs

249

Tôi gặp vấn đề tương tự và nghĩ rằng tôi muốn chia sẻ một giải pháp: nhiều dữ liệu / biểu mẫu dữ liệu.

Bằng cách gửi một biểu mẫu nhiều phần, trước tiên bạn gửi dưới dạng chuỗi dữ liệu meta JSON của bạn và sau đó gửi riêng dưới dạng nhị phân thô (hình ảnh, wavs, v.v.) được lập chỉ mục bởi tên Xử lý nội dung .

Đây là một hướng dẫn hay về cách thực hiện điều này trong obj-c, và đây là một bài viết blog giải thích cách phân vùng dữ liệu chuỗi với ranh giới biểu mẫu và tách nó khỏi dữ liệu nhị phân.

Thay đổi duy nhất bạn thực sự cần làm là ở phía máy chủ; bạn sẽ phải nắm bắt dữ liệu meta của mình để tham chiếu dữ liệu nhị phân đã được POST một cách thích hợp (bằng cách sử dụng ranh giới Bố trí nội dung).

Cấp nó yêu cầu công việc bổ sung ở phía máy chủ, nhưng nếu bạn đang gửi nhiều hình ảnh hoặc hình ảnh lớn, điều này là đáng giá. Kết hợp điều này với nén gzip nếu bạn muốn.

IMHO gửi dữ liệu được mã hóa base64 là một hack; dữ liệu đa dữ liệu / biểu mẫu RFC đã được tạo cho các vấn đề như: gửi dữ liệu nhị phân kết hợp với văn bản hoặc siêu dữ liệu.


4
Nhân tiện, API Google Drive đang thực hiện theo cách này: developers.google.com/drive/v2/reference/files/update#examples
Mathias Conradt

2
Tại sao câu trả lời này quá thấp khi nó sử dụng các tính năng gốc thay vì cố gắng ép một vòng tròn (nhị phân) vào một lỗ vuông (ASCII)? ...
Mark K Cowan

5
gửi dữ liệu được mã hóa base64 là một hack , dữ liệu đa dữ liệu / biểu mẫu cũng vậy. Ngay cả bài viết trên blog mà bạn đã liên kết cũng đọc rằng bằng cách sử dụng dữ liệu đa dữ liệu / biểu mẫu dạng nội dung mà bạn nêu, rằng những gì bạn gửi thực sự là một biểu mẫu. Nhưng nó không phải như vậy. Vì vậy, tôi nghĩ rằng hack cơ sở 64 không chỉ dễ thực hiện hơn mà còn đáng tin cậy hơn tôi đã thấy một số thư viện (ví dụ như Python), có mã hóa kiểu nội dung đa dữ liệu / biểu mẫu.
t3chb0t

4
@ t3chb0t Loại phương tiện đa dữ liệu / biểu mẫu dữ liệu được sinh ra để vận chuyển dữ liệu biểu mẫu nhưng ngày nay nó được sử dụng rộng rãi bên ngoài thế giới HTTP / HTML, đặc biệt là để mã hóa nội dung email. Hôm nay nó được đề xuất như một cú pháp mã hóa chung. tools.ietf.org/html/rfc7578
lorenzo

3
@MarkKCowan Có thể bởi vì mặc dù điều này hữu ích cho mục đích của câu hỏi, nhưng nó không trả lời câu hỏi như đã hỏi, đó là "nhị phân trên không thấp để mã hóa văn bản để sử dụng trong JSON", câu trả lời này hoàn toàn bỏ qua JSON.
Chinoto Vokro

34

Vấn đề với UTF-8 là nó không phải là mã hóa hiệu quả nhất về không gian. Ngoài ra, một số chuỗi byte nhị phân ngẫu nhiên là mã hóa UTF-8 không hợp lệ. Vì vậy, bạn không thể hiểu một chuỗi byte nhị phân ngẫu nhiên là một số dữ liệu UTF-8 vì nó sẽ là mã hóa UTF-8 không hợp lệ. Lợi ích của ràng buộc này đối với mã hóa UTF-8 là nó làm cho nó mạnh mẽ và có thể xác định vị trí các ký tự nhiều byte bắt đầu và kết thúc bất kỳ byte nào chúng ta bắt đầu xem xét.

Kết quả là, nếu mã hóa một giá trị byte trong phạm vi [0..127] sẽ chỉ cần một byte trong mã hóa UTF-8, mã hóa một giá trị byte trong phạm vi [128..255] sẽ cần 2 byte! Tệ hơn nữa. Trong JSON, các ký tự điều khiển, "và \ không được phép xuất hiện trong một chuỗi. Vì vậy, dữ liệu nhị phân sẽ yêu cầu một số biến đổi để được mã hóa chính xác.

Để xem. Nếu chúng ta giả sử các giá trị byte ngẫu nhiên được phân phối đồng đều trong dữ liệu nhị phân của chúng tôi thì trung bình, một nửa số byte sẽ được mã hóa thành một byte và nửa còn lại trong hai byte. Dữ liệu nhị phân được mã hóa UTF-8 sẽ có 150% kích thước ban đầu.

Mã hóa Base64 chỉ tăng lên 133% kích thước ban đầu. Vì vậy, mã hóa Base64 hiệu quả hơn.

Còn việc sử dụng mã hóa Base khác thì sao? Trong UTF-8, mã hóa 128 giá trị ASCII là không gian hiệu quả nhất. Trong 8 bit, bạn có thể lưu trữ 7 bit. Vì vậy, nếu chúng ta cắt dữ liệu nhị phân thành các đoạn 7 bit để lưu trữ chúng trong mỗi byte của chuỗi được mã hóa UTF-8, dữ liệu được mã hóa sẽ chỉ tăng lên 114% kích thước ban đầu. Tốt hơn Base64. Thật không may, chúng tôi không thể sử dụng thủ thuật dễ dàng này vì JSON không cho phép một số ký tự ASCII. 33 ký tự điều khiển của ASCII ([0..31] và 127) và "và \ phải được loại trừ. Điều này chỉ để lại cho chúng tôi 128-35 = 93 ký tự.

Vì vậy, về lý thuyết, chúng ta có thể định nghĩa một mã hóa Base93 sẽ tăng kích thước được mã hóa thành 8 / log2 (93) = 8 * log10 (2) / log10 (93) = 122%. Nhưng mã hóa Base93 sẽ không thuận tiện như mã hóa Base64. Base64 yêu cầu cắt chuỗi byte đầu vào trong các khối 6 bit mà hoạt động bitwise đơn giản hoạt động tốt. Bên cạnh 133% không nhiều hơn 122%.

Đây là lý do tại sao tôi đi đến độc lập với kết luận chung rằng Base64 thực sự là lựa chọn tốt nhất để mã hóa dữ liệu nhị phân trong JSON. Câu trả lời của tôi trình bày một lời biện minh cho nó. Tôi đồng ý rằng nó không hấp dẫn lắm từ quan điểm hiệu năng, nhưng cũng xem xét lợi ích của việc sử dụng JSON với biểu diễn chuỗi có thể đọc được của con người dễ dàng thao tác trong tất cả các ngôn ngữ lập trình.

Nếu hiệu suất là quan trọng hơn mã hóa nhị phân thuần túy thì nên được coi là sự thay thế của JSON. Nhưng với JSON, kết luận của tôi là Base64 là tốt nhất.


Thế còn Base128 nhưng sau đó để trình tuần tự hóa JSON thoát khỏi "và \? Tôi nghĩ thật hợp lý khi hy vọng người dùng sẽ sử dụng triển khai trình phân tích cú pháp json.
jcalfee314

1
@ jcalfee314 thật không may, điều này là không thể vì các ký tự có mã ASCII dưới 32 không được phép trong các chuỗi JSON. Các mã hóa với một cơ sở giữa 64 và 128 đã được xác định, nhưng tính toán cần thiết cao hơn cơ sở64. Việc tăng kích thước văn bản được mã hóa là không xứng đáng.
chmike

Nếu tải một lượng lớn hình ảnh trong Base64 (giả sử 1000) hoặc tải qua kết nối thực sự chậm, thì Base85 hoặc base93 có bao giờ trả cho lưu lượng mạng giảm (w / hoặc w / o gzip) không? Tôi tò mò liệu có một điểm mà dữ liệu nhỏ gọn hơn sẽ tạo ra một trường hợp cho một trong những phương pháp thay thế.
vol7ron

Tôi nghi ngờ tốc độ tính toán quan trọng hơn thời gian truyền. Hình ảnh rõ ràng nên được tính toán trước ở phía máy chủ. Dù sao, kết luận là JSON có hại cho dữ liệu nhị phân.
chmike

Re " Mã hóa Base64 chỉ tăng lên 133% kích thước ban đầu Vì vậy mã hóa Base64 hiệu quả hơn ", điều này hoàn toàn sai vì các ký tự thường là 2 byte mỗi ký tự. Xem chi tiết tại stackoverflow.com/questions/1443158/ từ
Pacerier 20/03/2017

34

BSON (Binary JSON) có thể làm việc cho bạn. http://en.wikipedia.org/wiki/BSON

Chỉnh sửa: FYI thư viện .NET json.net hỗ trợ đọc và viết bson nếu bạn đang tìm kiếm một số tình yêu bên máy chủ C #.


1
"Trong một số trường hợp, BSON sẽ sử dụng nhiều không gian hơn JSON do các tiền tố độ dài và các chỉ số mảng rõ ràng." vi.wikipedia.org/wiki/BSON
Pawel Cioch

Tin tốt: BSON thực sự hỗ trợ các loại như Binary, Datetime và một vài loại khác (đặc biệt hữu ích nếu bạn đang sử dụng MongoDB). Tin xấu: mã hóa là byte nhị phân ... vì vậy đây không phải là câu trả lời cho OP. Tuy nhiên, nó sẽ hữu ích đối với một kênh hỗ trợ nhị phân nguyên bản như tin nhắn RabbitMQ, tin nhắn ZeroMQ hoặc ổ cắm TCP hoặc UDP tùy chỉnh.
Dân H

19

Nếu bạn xử lý các vấn đề về băng thông, hãy thử nén dữ liệu ở phía máy khách trước, sau đó đến cơ sở64.

Một ví dụ hay về phép thuật như vậy là tại http://jszip.stuartk.co.uk/ và thảo luận thêm về chủ đề này là tại triển khai JavaScript của Gzip


2
đây là một triển khai mã JavaScript yêu cầu hiệu năng tốt hơn: zip.js
Janus Troelsen

Lưu ý rằng bạn vẫn có thể (và nên) vẫn nén sau (thường thông qua Content-Encoding), vì base64 nén khá tốt.
Mahmoud Al-Qudsi

@ MahmoudAl-Qudsi bạn có nghĩa là bạn base64 (zip (base64 (zip (data))))? Tôi không chắc chắn rằng thêm một zip khác và sau đó base64 nó (để có thể gửi nó dưới dạng dữ liệu) là ý tưởng tốt.
andrej

18

yEnc có thể làm việc cho bạn:

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

"yEnc là sơ đồ mã hóa nhị phân thành văn bản để truyền tệp nhị phân trong [văn bản]. Nó giảm chi phí so với các phương thức mã hóa dựa trên US-ASCII trước đó bằng cách sử dụng phương pháp mã hóa ASCII mở rộng 8 bit. mỗi giá trị byte xuất hiện xấp xỉ với cùng tần số trung bình) chỉ bằng 1 L22%, so với 33% trên 40% cho các phương thức mã hóa 6 bit như uuencode và Base64. ... Đến năm 2003 yEnc đã trở thành tiêu chuẩn thực tế hệ thống mã hóa cho các tệp nhị phân trên Usenet. "

Tuy nhiên, yEnc là một mã hóa 8 bit, do đó, việc lưu trữ nó trong chuỗi JSON có cùng các vấn đề như lưu trữ dữ liệu nhị phân gốc - thực hiện theo cách ngây thơ có nghĩa là mở rộng 100%, tệ hơn so với cơ sở64.


42
Vì nhiều người dường như vẫn đang xem câu hỏi này, tôi muốn đề cập rằng tôi không nghĩ rằng yEnc thực sự có ích ở đây. yEnc là một mã hóa 8 bit, do đó, việc lưu trữ nó trong chuỗi JSON có cùng các vấn đề như lưu trữ dữ liệu nhị phân gốc - thực hiện theo cách ngây thơ có nghĩa là mở rộng 100%, tệ hơn so với cơ sở64.
hobbs

Trong các trường hợp khi sử dụng các bảng mã như yEnc với bảng chữ cái lớn với dữ liệu JSON được coi là chấp nhận được, thì escapless có thể hoạt động như một giải pháp thay thế tốt cung cấp chi phí cố định đã biết trước.
Ivan Kosarev

10

Mặc dù đúng là Base64 có tốc độ mở rộng ~ 33%, nhưng không nhất thiết là việc xử lý chi phí cao hơn đáng kể: điều này thực sự phụ thuộc vào thư viện / bộ công cụ JSON mà bạn đang sử dụng. Mã hóa và giải mã là các thao tác chuyển tiếp đơn giản và thậm chí chúng có thể được tối ưu hóa mã hóa ký tự wrt (vì JSON chỉ hỗ trợ UTF-8/16/32) - các ký tự base64 luôn là một byte cho các mục nhập Chuỗi JSON. Ví dụ, trên nền tảng Java, có các thư viện có thể thực hiện công việc khá hiệu quả, do đó phần lớn chi phí chủ yếu là do kích thước mở rộng.

Tôi đồng ý với hai câu trả lời trước đó:

  • Base64 là tiêu chuẩn đơn giản, thường được sử dụng, do đó khó có thể tìm thấy thứ gì đó tốt hơn để sử dụng với JSON (base-85 được sử dụng bởi postcript, v.v., nhưng lợi ích là tốt nhất khi bạn nghĩ về nó)
  • nén trước khi mã hóa (và sau khi giải mã) có thể có nhiều ý nghĩa, tùy thuộc vào dữ liệu bạn sử dụng

10

Định dạng nụ cười

Nó rất nhanh để mã hóa, giải mã và thu gọn

So sánh tốc độ (tuy nhiên dựa trên java nhưng vẫn có ý nghĩa): https://github.com/eishay/jvm-serialulators/wiki/

Ngoài ra, đây là một phần mở rộng cho JSON cho phép bạn bỏ qua mã hóa base64 cho mảng byte

Chuỗi mã hóa nụ cười có thể được nén khi không gian quan trọng


3
... Và liên kết đã chết. Cái này có vẻ cập nhật: github.com/FasterXML/smile-format-specifying
Zero3

4

( Chỉnh sửa 7 năm sau: Google Gears đã biến mất. Bỏ qua câu trả lời này.)


Nhóm Google Gears gặp phải vấn đề thiếu loại dữ liệu nhị phân và đã cố gắng giải quyết nó:

API Blob

JavaScript có kiểu dữ liệu tích hợp cho chuỗi văn bản, nhưng không có gì cho dữ liệu nhị phân. Đối tượng Blob cố gắng giải quyết giới hạn này.

Có lẽ bạn có thể dệt nó trong một số cách.


Vì vậy, trạng thái của các đốm màu trong Javascript và json là gì? Nó đã bị rơi?
chmike

w3.org/TR/FileAPI/#blob-section Không phải là biểu diễn như base64 cho không gian, nếu bạn cuộn xuống bạn thấy rằng nó mã hóa bằng bản đồ utf8 (là một trong những tùy chọn được hiển thị bởi câu trả lời của hobbs). Và không có hỗ trợ json, như tôi biết
Daniele Cruciani

3

Vì bạn đang tìm kiếm khả năng chuyển dữ liệu nhị phân thành định dạng rất hạn chế dựa trên văn bản và rất hạn chế, tôi nghĩ rằng chi phí hoạt động của Base64 là tối thiểu so với sự thuận tiện mà bạn mong muốn duy trì với JSON. Nếu sức mạnh xử lý và thông lượng là một mối quan tâm, thì có lẽ bạn cần phải xem xét lại các định dạng tệp của mình.


2

Chỉ cần thêm quan điểm tài nguyên và độ phức tạp vào cuộc thảo luận. Vì thực hiện PUT / POST và PATCH để lưu trữ tài nguyên mới và thay đổi chúng, nên nhớ rằng việc truyền nội dung là một đại diện chính xác của nội dung được lưu trữ và được nhận bằng cách phát hành thao tác GET.

Một thông điệp đa phần thường được sử dụng như một vị cứu tinh nhưng vì lý do đơn giản và cho các nhiệm vụ phức tạp hơn, tôi thích ý tưởng đưa ra toàn bộ nội dung. Nó là tự giải thích và nó là đơn giản.

Và có JSON là một cái gì đó làm tê liệt nhưng cuối cùng bản thân JSON là dài dòng. Và chi phí chung của ánh xạ tới BASE64 là một cách nhỏ.

Sử dụng các thông điệp nhiều phần một cách chính xác, người ta phải tháo dỡ đối tượng để gửi, sử dụng đường dẫn thuộc tính làm tên tham số cho kết hợp tự động hoặc sẽ cần tạo một giao thức / định dạng khác để chỉ thể hiện tải trọng.

Cũng thích cách tiếp cận BSON, đây không phải là cách tiếp cận rộng rãi và dễ dàng như người ta mong muốn.

Về cơ bản, chúng tôi chỉ bỏ lỡ một cái gì đó ở đây nhưng việc nhúng dữ liệu nhị phân là cơ sở 64 được thiết lập tốt và sẽ đi trừ khi bạn thực sự xác định được nhu cầu thực hiện chuyển giao nhị phân thực sự (điều này thường không xảy ra).


1

Tôi đào sâu thêm một chút (trong quá trình triển khai Base128 ) và tiết lộ rằng khi chúng tôi gửi các ký tự có mã ascii lớn hơn 128 thì trình duyệt (chrome) thực tế gửi TWO ký tự (byte) thay vì một :( . Lý do là JSON bởi defaul sử dụng các ký tự utf8 cho các ký tự có mã ascii trên 127 được mã hóa bằng hai byte được đề cập bởi câu trả lời chmike . Tôi đã thực hiện kiểm tra theo cách này: nhập vào thanh url chrome chrome: // net-export / , chọn "Bao gồm thô byte ", bắt đầu chụp, gửi yêu cầu POST (sử dụng đoạn mã ở dưới cùng), dừng chụp và lưu tệp json với dữ liệu yêu cầu thô. Sau đó, chúng tôi xem bên trong tệp json đó:

  • Chúng tôi có thể tìm thấy yêu cầu cơ sở của chúng tôi bằng cách tìm chuỗi 4142434445464748494a4b4c4d4enày là mã hex ABCDEFGHIJKLMNvà chúng tôi sẽ thấy yêu "byte_count": 639cầu đó.
  • Chúng tôi có thể tìm thấy yêu cầu trên 127 của chúng tôi bằng cách tìm chuỗi C2BCC2BDC380C381C382C383C384C385C386C387C388C389C38AC38Bnày là mã ký tự utf8 yêu cầu hex ¼½ÀÁÂÃÄÅÆÇÈÉÊË(tuy nhiên mã hex ascii của các ký tự này là c1c2c3c4c5c6c7c8c9cacbcccdce). Vì "byte_count": 703vậy, nó dài hơn 64byte so với yêu cầu base64 vì các ký tự có mã ascii trên 127 là mã bằng 2 byte trong yêu cầu :(

Vì vậy, trên thực tế, chúng tôi không có lợi nhuận khi gửi các ký tự có mã> 127 :(. Đối với chuỗi base64, chúng tôi không quan sát hành vi tiêu cực như vậy (có lẽ đối với cơ sở85 - tôi không kiểm tra nó) - tuy nhiên có thể một số giải pháp cho vấn đề này sẽ là gửi dữ liệu trong phần nhị phân của POST multiart / form-data được mô tả trong câu trả lời Ælex (tuy nhiên thông thường trong trường hợp này chúng ta không cần sử dụng bất kỳ mã hóa cơ sở nào cả ...).

Cách tiếp cận khác có thể dựa vào việc ánh xạ hai phần dữ liệu byte thành một ký tự utf8 hợp lệ bằng mã bằng cách sử dụng cái gì đó như base65280 / base65k nhưng có lẽ nó sẽ kém hiệu quả hơn base64 do đặc tả utf8 ...


0

Kiểu dữ liệu thực sự quan tâm. Tôi đã thử nghiệm các kịch bản khác nhau về việc gửi tải trọng từ tài nguyên RESTful. Để mã hóa, tôi đã sử dụng Base64 (Apache) và để nén GZIP (java.utils.zip. *). Tải trọng chứa thông tin về phim, hình ảnh và tệp âm thanh. Tôi đã nén và mã hóa các tập tin hình ảnh và âm thanh làm giảm đáng kể hiệu suất. Mã hóa trước khi nén hóa ra tốt. Nội dung hình ảnh và âm thanh được gửi dưới dạng byte được mã hóa và nén [].


0

Tham khảo: http://snia.org/sites/default/files/Multi-part%20MIME%20Extension%20v1.0g.pdf

Nó mô tả một cách để chuyển dữ liệu nhị phân giữa máy khách CDMI và máy chủ bằng cách sử dụng các hoạt động 'loại nội dung CDMI' mà không yêu cầu chuyển đổi cơ sở dữ liệu nhị phân.

Nếu bạn có thể sử dụng thao tác 'Loại nội dung không phải CDMI', thì việc chuyển 'dữ liệu' sang / từ một đối tượng là lý tưởng. Sau đó, siêu dữ liệu có thể được thêm / truy xuất đến / từ đối tượng dưới dạng hoạt động 'loại nội dung CDMI' tiếp theo.


-1

Giải pháp của tôi bây giờ, XHR2 đang sử dụng ArrayBuffer. ArrayBuffer dưới dạng chuỗi nhị phân chứa nhiều nội dung, video, âm thanh, đồ họa, văn bản, v.v với nhiều loại nội dung. Tất cả trong một Phản ứng.

Trong trình duyệt hiện đại, có DataView, StringView và Blob cho các Thành phần khác nhau. Xem thêm: http://rolfrost.de/video.html để biết thêm chi tiết.


Bạn sẽ làm cho dữ liệu của mình tăng + 100% bằng cách tuần tự hóa một mảng byte
Sharcoux

@Sharcoux wot ??
Mihail Malostanidis

Việc tuần tự hóa một mảng byte trong JSON là một cái gì đó như: [16, 2, 38, 89]rất không hiệu quả.
Sharcoux
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.