Zlib Deflate 動作デモ imaya Follow 2011-10-13 14:30:43 License: MIT License Fork0 Fav0 View4585 Play Stop Reload Fullscreen Smart Phone Readme JavaScript 84 lines HTML 78 lines CSS 18 lines JavaScript で Zlib(RFC1950), Deflate(RFC1951) の実装を行いました。 ライブラリについては http://jsdo.it/imaya/zlib.deflate.full に記載しています。 ブログの方にも簡単な説明を書いていますので、もしよければどうぞ。 http://blog.livedoor.jp/imaya_js/archives/4545005.html Zlib Deflate 動作デモ Zlib Inflate (from pdf.js) Zlib and Deflate Encode Library (function(global) { /** * main function */ function main() { var elmRun = id('input_run'); elmRun.addEventListener('click', onClick); } main(); /** * click event handler */ function onClick(ev) { var elmScript = id('input_script'); eval(elmScript.value); //assertEqualsArray([1, 2, 3], [1, 2, 3]); } /** * get element by ID */ function id(elementId) { return document.getElementById(elementId); } /** * inflate */ function inflate(deflated, toString) { var inflateUint8Array = (new FlateStream(deflated)).getBytes(), inflate = []; // uint8array -> array for (var i = 0, l = inflateUint8Array.length; i < l; i++) { inflate[i] = inflateUint8Array[i]; } return toString ? String.fromCharCode.apply(null, inflate) : inflate; } var logCount = 0; function log(message) { var elmLog = id('log'), elmNew = document.createElement('div'); elmNew.innerHTML = message; elmNew.className = (logCount % 2 === 0) ? 'log_even' : 'log_odd'; console.log(message); elmLog.appendChild(elmNew); logCount++; } /** * assert Array */ function assertArrayEquals(array1, array2) { var index, length = array1.length; if (!(array1 instanceof Array) || !(array2 instanceof Array)) { throw 'not Array'; } if (length !== array2.length) { throw 'not equals'; } for (index = 0; index < length; index++) { if (array1[index] !== array2[index]) { throw 'not equals'; } } return true; } })(this); <form id="input"> <textarea id="input_script" style="width: 100%; height: 24em;"> /** * Usage: * Zlib.Deflate.compress(data[, parameters]); * * data: {String|Array} 圧縮対象のデータ * parameters: {Object} 圧縮パラメータ * compressionType: * {Zlib.Deflate.CompressionType} * 圧縮方式(NONE,FIXED,DYNAMIC) * * Array (byte array) で返るのでその後の処理は適宜行う事 * * * 今回はデモ用に pdf.js から抽出した inflate が * 利用出来るようになっています。 * * inflate(deflated[, toString]); * * deflated: {Array} Deflate 符号化されたデータ * toString: {Boolean} true ならば String で * それ以外ならば Array で返す * * * また、配列の一致を確認するには * assertEqualsArray(array1, array2) * が利用出来ます。 */ var testData, deflated, inflated; (function testString(){ log('[String]'); testData = 'aaaaa'; deflated = Zlib.Deflate.compress(testData, { compressionType: Zlib.Deflate.CompressionType.DYNAMIC }); inflated = inflate(deflated, true); log('Source: ' + testData.length); log('Deflate: ' + deflated.length); log('Inflate: ' + inflated.length); log('Assert: ' + (inflated === testData)); })(); (function testArray(){ var min = 50000, i, random1, random2; log('[Array]'); testData = []; while (testData.length < min) { random1 = Math.floor(Math.random() * 256); random2 = Math.floor(Math.random() * 256); for (i = 0; i < random2; i++) { testData.push((random1 + i) % 256); } } deflated = Zlib.Deflate.compress(testData, { compressionType: Zlib.Deflate.CompressionType.DYNAMIC }); inflated = inflate(deflated); log('Source: ' + testData.length); log('Deflate: ' + deflated.length); log('Inflate: ' + inflated.length); log('Assert: ' + assertArrayEquals(testData, inflated)); })(); </textarea><br /> <input id="input_run" type="button" value="Run" /> <div id="log"></div> </form> Zlib Deflate 動作デモ textarea { overflow: scroll; } div#log { background-color: white; border: 1px solid black; width: 100%; height: 24em; overflow: scroll; } div#log > div { padding: 5px; } div.log_even { background-color: #eee; } JavaScript で Zlib(RFC1950), Deflate(RFC1951) の実装を行いました。 ライブラリについては http://jsdo.it/imaya/zlib.deflate.full に記載しています。 ブログの方にも簡単な説明を書いていますので、もしよければどうぞ。 http://blog.livedoor.jp/imaya_js/archives/4545005.html (function(global) { /** * main function */ function main() { var elmRun = id('input_run'); elmRun.addEventListener('click', onClick); } main(); /** * click event handler */ function onClick(ev) { var elmScript = id('input_script'); eval(elmScript.value); //assertEqualsArray([1, 2, 3], [1, 2, 3]); } /** * get element by ID */ function id(elementId) { return document.getElementById(elementId); } /** * inflate */ function inflate(deflated, toString) { var inflateUint8Array = (new FlateStream(deflated)).getBytes(), inflate = []; // uint8array -> array for (var i = 0, l = inflateUint8Array.length; i < l; i++) { inflate[i] = inflateUint8Array[i]; } return toString ? String.fromCharCode.apply(null, inflate) : inflate; } var logCount = 0; function log(message) { var elmLog = id('log'), elmNew = document.createElement('div'); elmNew.innerHTML = message; elmNew.className = (logCount % 2 === 0) ? 'log_even' : 'log_odd'; console.log(message); elmLog.appendChild(elmNew); logCount++; } /** * assert Array */ function assertArrayEquals(array1, array2) { var index, length = array1.length; if (!(array1 instanceof Array) || !(array2 instanceof Array)) { throw 'not Array'; } if (length !== array2.length) { throw 'not equals'; } for (index = 0; index < length; index++) { if (array1[index] !== array2[index]) { throw 'not equals'; } } return true; } })(this); <form id="input"> <textarea id="input_script" style="width: 100%; height: 24em;"> /** * Usage: * Zlib.Deflate.compress(data[, parameters]); * * data: {String|Array} 圧縮対象のデータ * parameters: {Object} 圧縮パラメータ * compressionType: * {Zlib.Deflate.CompressionType} * 圧縮方式(NONE,FIXED,DYNAMIC) * * Array (byte array) で返るのでその後の処理は適宜行う事 * * * 今回はデモ用に pdf.js から抽出した inflate が * 利用出来るようになっています。 * * inflate(deflated[, toString]); * * deflated: {Array} Deflate 符号化されたデータ * toString: {Boolean} true ならば String で * それ以外ならば Array で返す * * * また、配列の一致を確認するには * assertEqualsArray(array1, array2) * が利用出来ます。 */ var testData, deflated, inflated; (function testString(){ log('[String]'); testData = 'aaaaa'; deflated = Zlib.Deflate.compress(testData, { compressionType: Zlib.Deflate.CompressionType.DYNAMIC }); inflated = inflate(deflated, true); log('Source: ' + testData.length); log('Deflate: ' + deflated.length); log('Inflate: ' + inflated.length); log('Assert: ' + (inflated === testData)); })(); (function testArray(){ var min = 50000, i, random1, random2; log('[Array]'); testData = []; while (testData.length < min) { random1 = Math.floor(Math.random() * 256); random2 = Math.floor(Math.random() * 256); for (i = 0; i < random2; i++) { testData.push((random1 + i) % 256); } } deflated = Zlib.Deflate.compress(testData, { compressionType: Zlib.Deflate.CompressionType.DYNAMIC }); inflated = inflate(deflated); log('Source: ' + testData.length); log('Deflate: ' + deflated.length); log('Inflate: ' + inflated.length); log('Assert: ' + assertArrayEquals(testData, inflated)); })(); </textarea><br /> <input id="input_run" type="button" value="Run" /> <div id="log"></div> </form> textarea { overflow: scroll; } div#log { background-color: white; border: 1px solid black; width: 100%; height: 24em; overflow: scroll; } div#log > div { padding: 5px; } div.log_even { background-color: #eee; } use an iframe compat browser, deer Play on jsdo.it games Author Share ブログに埋め込む QR Tag Download Complete! Description What kind of game? JavaScript で Zlib(RFC1950), Deflate(RFC1951) の実装を行いました。 ライブラリについては http://jsdo.it/imaya/zlib.deflate.full に記載しています。 ブログの方にも簡単な説明を書いていますので、もしよければどうぞ。 http://blog.livedoor.jp/imaya_js/archives/4545005.html Control Device Smartphone Controllerjsdo.it WebSocket Controller» Mouse Keyboard Touch Device Fullscreen Activated Inactivated jsdo.it games から削除する Submit Author imaya URLhttp://twitter.com/y_imaya Tweet Default Panel Auto play Screenshot Readme JavaScript HTML CSS Size Width: px Height: px code <script type="text/javascript" src="http://jsdo.it/blogparts/wC7x/js"></script> deflate zlib Discussion Questions on this code? Tags deflate zlib