V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐关注
Meteor
JSLint - a JavaScript code quality tool
jsFiddle
D3.js
WebStorm
推荐书目
JavaScript 权威指南第 5 版
Closure: The Definitive Guide
MrSong0607
V2EX  ›  JavaScript

求指教这段 JS 代码是在做什么

  •  
  •   MrSong0607 · 2017-01-05 12:28:43 +08:00 · 3470 次点击
    这是一个创建于 2871 天前的主题,其中的信息可能已经有所发展或是发生改变。

    如题:

    __d('BitMap', [], (function a(b, c, d, e, f, g) {
        var h = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ-_';
    
        function i() {
            'use strict';
            this.$BitMap1 = [];
        }
    
        i.prototype.set = function(l) {
            'use strict';
            this.$BitMap1[l] = 1;
            return this;
        };
    
        i.prototype.toString = function() {
            'use strict';
            var l = [];
            for (var m = 0; m < this.$BitMap1.length; m++)
                l.push(this.$BitMap1[m] ? 1 : 0);
            return l.length ? k(l.join('')) : '';
        };
    
        i.prototype.toCompressedString = function() {
            'use strict';
            if (this.$BitMap1.length === 0) return '';
            var l = [],
                m = 1,
                n = this.$BitMap1[0] || 0,
                o = n.toString(2);
            for (var p = 1; p < this.$BitMap1.length; p++) {
                var q = this.$BitMap1[p] || 0;
                if (q === n) { m++; } else {
                    l.push(j(m));
                    n = q;
                    m = 1;
                }
            }
            if (m) l.push(j(m));
            return k(o + l.join(''));
        };
    
        function j(l) {
            var m = l.toString(2),
                n = '0'.repeat(m.length - 1);
            return n + m;
        }
    
        function k(l) {
            var m = (l + '00000').match(/[01]{6}/g),
                n = '';
            for (var o = 0; o < m.length; o++)
                n += h[parseInt(m[o], 2)];
            return n;
        }
        f.exports = i;
    }), null);
    
    第 1 条附言  ·  2017-01-05 13:02:55 +08:00
    没说清楚,只需要看 toCompressedString 这个函数的作用就好了,先谢过
    12 条回复    2017-01-06 10:40:33 +08:00
    btjoker
        1
    btjoker  
       2017-01-05 13:00:04 +08:00
    base64 和图片相关
    你这代码没头没尾的, 让人猜?
    Nitroethane
        2
    Nitroethane  
       2017-01-05 13:01:49 +08:00 via Android
    函数的命名方式也是奇葩
    Nutlee
        3
    Nutlee  
       2017-01-05 13:15:51 +08:00
    这代码是压缩后的代码又格式化过的吧,建议看找源代码看啊 压缩会优化命名.....
    alwayshere
        4
    alwayshere  
       2017-01-05 13:23:31 +08:00
    @Nitroethane 这是压缩后的代码,函数命名全变了
    polun
        5
    polun  
       2017-01-05 13:45:52 +08:00
    感觉像压缩字符串的。
    rekulas
        6
    rekulas  
       2017-01-05 13:56:55 +08:00
    感觉像压缩二进制数据的,如果是,作者技术不错啊
    enenaaa
        7
    enenaaa  
       2017-01-05 14:10:12 +08:00
    用行程编码方式将二进制压缩成字符串, j 是具体的转换函数。
    enenaaa
        8
    enenaaa  
       2017-01-05 14:27:29 +08:00   ❤️ 1
    上面一条说得不太对, 应该是类似 base64 那样的转换编码。
    iEverX
        9
    iEverX  
       2017-01-05 14:29:45 +08:00   ❤️ 1
    bitmap 只有 0 和 1 , toCompressedString 里面的 l 记录了连续的 0 或者 1 的次数, j 函数想字符串前面加的 0 是为了能够区分连续的两个次数。 o + l.join('')是压缩后的 01 字符串
    davidzd
        10
    davidzd  
       2017-01-05 15:16:57 +08:00
    压缩字符串啊。。
    limerick
        11
    limerick  
       2017-01-05 15:26:52 +08:00   ❤️ 1
    toString 对二进制数据进行 base64 。 toCompressedString 对数据进行压缩处理然后进行 base64 。不过这个压缩处理要看压缩对象了,他这个处理方式是直接根据二进制中 0 , 1 的重复次数进行压缩。如果分布不是很连续感觉压缩之后打了很多。
    MrSong0607
        12
    MrSong0607  
    OP
       2017-01-06 10:40:33 +08:00
    @limerick
    @iEverX
    @enenaaa
    感谢各位
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2849 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 02:39 · PVG 10:39 · LAX 18:39 · JFK 21:39
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.