LZW.ts 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. /**
  2. * LZW编码解析
  3. */
  4. export default class LZW {
  5. static decode(arr, min) {
  6. let clearCode = 1 << min,
  7. eofCode = clearCode + 1,
  8. size = min + 1,
  9. dict = [],
  10. pos = 0;
  11. function clear() {
  12. let i;
  13. dict = [];
  14. size = min + 1;
  15. for (i = 0; i < clearCode; i++) {
  16. dict[i] = [i];
  17. }
  18. dict[clearCode] = [];
  19. dict[eofCode] = null;
  20. }
  21. function decode() {
  22. let out = [],
  23. code, last;
  24. while (1) {
  25. last = code;
  26. code = read(size);
  27. if (code == clearCode) {
  28. clear();
  29. continue;
  30. }
  31. if (code == eofCode) {
  32. break;
  33. }
  34. if (code < dict.length) {
  35. if (last !== clearCode) {
  36. dict.push(dict[last].concat(dict[code][0]));
  37. }
  38. } else {
  39. if (code !== dict.length) {
  40. throw new Error('LZW解析出错');
  41. }
  42. dict.push(dict[last].concat(dict[last][0]));
  43. }
  44. out.push.apply(out, dict[code]);
  45. if (dict.length === (1 << size) && size < 12) {
  46. size++;
  47. }
  48. }
  49. return out;
  50. }
  51. function read(size) {
  52. let i, code = 0;
  53. for (i = 0; i < size; i++) {
  54. if (arr[pos >> 3] & 1 << (pos & 7)) {
  55. code |= 1 << i;
  56. }
  57. pos++;
  58. }
  59. return code;
  60. }
  61. return decode();
  62. }
  63. }