Gzip의 JavaScript 구현
JSON 데이터를 AJAX를 통해 작은 고정 크기의 서버 측 캐시에 저장해야 하는 웹 애플리케이션을 작성 중입니다(생각: 오픈소셜 쿼터).서버를 제어할 수 없습니다.
서버측 할당량을 유지하기 위해 저장된 데이터의 크기를 줄일 필요가 있으며, 서버로 전송하기 전에 브라우저에서 문자열화된 JSON을 gzip으로 압축할 수 있기를 희망합니다.
그러나 Gzip의 JavaScript 구현에 대해서는 많은 것을 찾을 수 없습니다.데이터를 전송하기 전에 클라이언트 측에서 데이터를 압축할 수 있는 방법이 있습니까?
편집 Unicode 문자열을 올바르게 처리하는 더 나은 LZW 솔루션이 http://pieroxy.net/blog/pages/lz-string/index.html에 있는 것 같습니다(댓글의 pieroxy 덕분에).
gzip 실장은 모르지만 jsolait 라이브러리(사이트가 없어진 것 같습니다)에는 LZW 압축/압축 해제 기능이 있습니다.코드는 LGPL의 적용을 받습니다.
// LZW-compress a string
function lzw_encode(s) {
var dict = {};
var data = (s + "").split("");
var out = [];
var currChar;
var phrase = data[0];
var code = 256;
for (var i=1; i<data.length; i++) {
currChar=data[i];
if (dict[phrase + currChar] != null) {
phrase += currChar;
}
else {
out.push(phrase.length > 1 ? dict[phrase] : phrase.charCodeAt(0));
dict[phrase + currChar] = code;
code++;
phrase=currChar;
}
}
out.push(phrase.length > 1 ? dict[phrase] : phrase.charCodeAt(0));
for (var i=0; i<out.length; i++) {
out[i] = String.fromCharCode(out[i]);
}
return out.join("");
}
// Decompress an LZW-encoded string
function lzw_decode(s) {
var dict = {};
var data = (s + "").split("");
var currChar = data[0];
var oldPhrase = currChar;
var out = [currChar];
var code = 256;
var phrase;
for (var i=1; i<data.length; i++) {
var currCode = data[i].charCodeAt(0);
if (currCode < 256) {
phrase = data[i];
}
else {
phrase = dict[currCode] ? dict[currCode] : (oldPhrase + currChar);
}
out.push(phrase);
currChar = phrase.charAt(0);
dict[code] = oldPhrase + currChar;
code++;
oldPhrase = phrase;
}
return out.join("");
}
gzip으로 데이터를 인코딩하는 것이 아니라 gzip으로 데이터를 디코딩하는 것이 또 다른 문제가 있었습니다.브라우저 외부에서 javascript 코드를 실행하고 있기 때문에 순수 javascript를 사용하여 디코딩해야 합니다.
시간이 좀 걸렸지만 JSXGraph 라이브러리에서 gzipped 데이터를 읽을 수 있는 방법이 있다는 것을 알게 되었습니다.
여기서 라이브러리를 찾았습니다.http://jsxgraph.uni-bayreuth.de/wp/2009/09/29/jsxcompressor-zlib-compressed-javascript-code/ JSXCompressor라는 스탠드아론 유틸리티도 있습니다.코드는 LGPL 라이선스가 되어 있습니다.
jsxcompressor.js 파일을 프로젝트에 포함시키면 기본 64 인코딩된 gzipped 데이터를 읽을 수 있습니다.
<!doctype html>
</head>
<title>Test gzip decompression page</title>
<script src="jsxcompressor.js"></script>
</head>
<body>
<script>
document.write(JXG.decompress('<?php
echo base64_encode(gzencode("Try not. Do, or do not. There is no try."));
?>'));
</script>
</html>
당신이 원하는 것이 아닌 것은 이해하지만, 그래도 도움이 될 것 같아서 여기에 회신합니다.
javascript에 대한 zlib 포트인 pako https://github.com/nodeca/pako을 방금 출시했습니다.그것이 deflate/bulve/gzip/unzip의 가장 빠른 구현이라고 생각합니다.또한, 그것은 민주적인 MIT 라이선스를 가지고 있다.Pako는 모든 zlib 옵션을 지원하며 결과는 2진수입니다.
예:
var inflate = require('pako/lib/inflate').inflate;
var text = inflate(zipped, {to: 'string'});
GWT 모듈에서 독립형 JavaScript로 LZMA 구현을 포팅했습니다.LZMA-JS라고 해요
다음은 Javascript에서 구현된 기타 압축 알고리즘입니다.
테스트하지 않았습니다만, JSZip이라고 불리는 ZIP의 Javascript 구현이 있습니다.
일반적인 클라이언트측 JavaScript 압축 실장은 비압축 payload를 가진 몇 개의 HTTP 패킷 전송 시간이 아닌 처리 시간 측면에서 매우 비싼 작업이 될 것입니다.
얼마나 많은 시간을 절약할 수 있는지 알 수 있는 테스트를 해본 적이 있습니까?즉, 대역폭 절감이 원하는 것이 아닐 수도 있고, 그렇지 않습니까?
대부분의 브라우저는 즉시 gzip 압축을 해제할 수 있습니다.이는 javascript 구현보다 더 나은 옵션일 수 있습니다.
페이지에 내장된 1픽셀당 1픽셀의 Java 애플릿을 사용하여 압축할 수 있습니다.
JavaScript는 아니며 클라이언트는 Java 런타임이 필요하지만 필요한 작업을 수행할 수 있습니다.
언급URL : https://stackoverflow.com/questions/294297/javascript-implementation-of-gzip
'it-source' 카테고리의 다른 글
행을 찾을 수 없는 경우 JOIN 조건의 폴백 값 (0) | 2022.11.20 |
---|---|
특수한 포인터Collectors.toMap에 null 엔트리 값이 있는 예외가 있습니다. (0) | 2022.11.20 |
개체 목록 섞기 (0) | 2022.11.20 |
MySql 최대 메모리 용량이 위험할 정도로 높아도 증대가 필요함 (0) | 2022.11.19 |
bind_result vs get_result를 사용하는 방법의 예 (0) | 2022.11.19 |