V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
pyengwoei
V2EX  ›  程序员

一小段 js 代码翻译成 Python 或者 C#,谢谢了

  •  
  •   pyengwoei · 2016-06-30 16:11:24 +08:00 · 7973 次点击
    这是一个创建于 2860 天前的主题,其中的信息可能已经有所发展或是发生改变。
    var a = "60o0749460o07134482";
    //var b= parseInt(a, 10);
    G = function(a, b) {
    var c = function(a)
    {
    for (var b, c = [], d = 3, e = function(a)
    {
    return a >= "0" && "9" >= a ? parseInt(a, 10) : a.charCodeAt(0) - "a".charCodeAt(0) + 10
    }, f = function(a, b) {
    var c, d, f, g, h;
    //c =e 函数
    return c = e(a[b]), d = e(a[b + 1]), d = 15 & d, f = (12 & c) >> 2, g = (2 & c) > 0, h = (1 & c) > 0,
    {
    value: d, //d=e 函数
    winner: f,// f = (12 & c)
    playerPair: g, //g=(2&c)
    bankerPair: h // h = (1 & c) > 0
    }
    },
    g = 0; g < a.length - 1; g += 2)
    b = f(a, g), b.winner !== d ? c.push(b) : c = [];
    return c
    };
    if (!a || void 0 === b) return [];
    switch (a) {
    case "7bal":
    case "bal":
    return c(b);
    case "rol":
    case "rofl":
    return b.split(";").map(function(a) {
    return {
    result: a
    }
    });
    default:
    return b
    }
    }

    document.write(G("bal",a));
    第 1 条附言  ·  2016-06-30 17:02:50 +08:00


    格式化的代码在这里
    第 2 条附言  ·  2016-06-30 17:08:34 +08:00
    主要就是 for 循环(这里面的复杂一点点)
    翻译成功运行的我发 66 元支付宝红包已示感谢
    谢谢大家了
    42 条回复    2016-07-07 15:24:43 +08:00
    pyengwoei
        1
    pyengwoei  
    OP
       2016-06-30 16:13:15 +08:00
    或者把这段 JS 翻译成通俗一点,也行,实在看不太明白
    xcatliu
        2
    xcatliu  
       2016-06-30 16:16:59 +08:00
    可以先排版好么……
    pyengwoei
        3
    pyengwoei  
    OP
       2016-06-30 16:22:55 +08:00
    var a = "60o0749460o07134482";
    //var b= parseInt(a, 10);
    G = function(a, b) {
    var c = function(a)
    {
    for (var b, c = [], d = 3, e = function(a)
    {
    return a >= "0" && "9" >= a ? parseInt(a, 10) : a.charCodeAt(0) - "a".charCodeAt(0) + 10
    }, f = function(a, b) {
    var c, d, f, g, h;
    //c =e 函数
    return c = e(a[b]), d = e(a[b + 1]), d = 15 & d, f = (12 & c) >> 2, g = (2 & c) > 0, h = (1 & c) > 0,
    {
    value: d, //d=e 函数
    winner: f,// f = (12 & c)
    playerPair: g, //g=(2&c)
    bankerPair: h // h = (1 & c) > 0
    }
    },
    g = 0; g < a.length - 1; g += 2)
    b = f(a, g), b.winner !== d ? c.push(b) : c = [];
    return c
    };
    if (!a || void 0 === b) return [];
    switch (a) {
    case "7bal":
    case "bal":
    return c(b);
    case "rol":
    case "rofl":
    return b.split(";").map(function(a) {
    return {
    result: a
    }
    });
    default:
    return b
    }
    }

    document.write(G("bal",a));
    pyengwoei
        4
    pyengwoei  
    OP
       2016-06-30 16:23:39 +08:00
    放到 IDE 里面看 就不会乱 这里排好了发出来 又乱了
    whnzy
        5
    whnzy  
       2016-06-30 16:28:57 +08:00
    用 ``` <pre> ```试试
    calabashfox
        6
    calabashfox  
       2016-06-30 16:31:03 +08:00
    因为做过代码混淆了。。能理清楚也是厉害
    DoraJDJ
        7
    DoraJDJ  
       2016-06-30 16:31:19 +08:00
    @pyengwoei 试试 GitHub Gist
    pyengwoei
        8
    pyengwoei  
    OP
       2016-06-30 16:38:57 +08:00
    @calabashfox 没有混淆,只是函数名都是 一个字母放在 IDE 里面逻辑很清楚的
    ynyounuo
        9
    ynyounuo  
       2016-06-30 16:39:20 +08:00   ❤️ 1
    pyengwoei
        10
    pyengwoei  
    OP
       2016-06-30 16:44:44 +08:00
    @ynyounuo 可以付费 OK 了 我发你红包 你留一个支付宝给我
    pyengwoei
        11
    pyengwoei  
    OP
       2016-06-30 16:45:42 +08:00
    @DoraJDJ 谢谢 这个真不错 呵呵
    pyengwoei
        12
    pyengwoei  
    OP
       2016-06-30 16:50:28 +08:00
    @ynyounuo 你接吗,你接 我就等你的
    zrp1994
        13
    zrp1994  
       2016-06-30 16:51:20 +08:00
    @pyengwoei
    楼主你试试下面这种东西?
    https://github.com/PiotrDabkowski/Js2Py
    maijiawei
        14
    maijiawei  
       2016-06-30 16:58:09 +08:00
    我试着帮你翻译看看
    pyengwoei
        15
    pyengwoei  
    OP
       2016-06-30 16:58:44 +08:00
    @maijiawei 好人啊 /(ㄒoㄒ)/~~
    pyengwoei
        16
    pyengwoei  
    OP
       2016-06-30 16:59:31 +08:00
    @maijiawei 代码在 9 楼
    pyengwoei
        17
    pyengwoei  
    OP
       2016-06-30 16:59:58 +08:00
    @zrp1994 好的我让他们试试
    jeremaihloo
        18
    jeremaihloo  
       2016-06-30 17:09:53 +08:00
    强迫症看到你这代码乱的心里好难受,为什么不格式好
    maijiawei
        19
    maijiawei  
       2016-06-30 17:10:39 +08:00
    这段代码哪里的,功能是什么,混淆过,这代码功能应该是加密解密的?
    pyengwoei
        20
    pyengwoei  
    OP
       2016-06-30 17:11:18 +08:00
    pyengwoei
        21
    pyengwoei  
    OP
       2016-06-30 17:12:38 +08:00
    @maijiawei 对是解密的
    maijiawei
        22
    maijiawei  
       2016-06-30 17:16:29 +08:00
    var c = function(a)
    {
    for (var b, c = [], d = 3, e = function(a)
    {
    return a >= "0" && "9" >= a ? parseInt(a, 10) : a.charCodeAt(0) - "a".charCodeAt(0) + 10
    }, f = function(a, b) {
    var c, d, f, g, h;
    //c =e 函数
    return c = e(a[b]), d = e(a[b + 1]), d = 15 & d, f = (12 & c) >> 2, g = (2 & c) > 0, h = (1 & c) > 0,
    {
    value: d, //d=e 函数
    winner: f,// f = (12 & c)
    playerPair: g, //g=(2&c)
    bankerPair: h // h = (1 & c) > 0
    }
    },
    g = 0; g < a.length - 1; g += 2)
    b = f(a, g), b.winner !== d ? c.push(b) : c = [];
    return c
    };

    解密的过程就这一段咯。变量一个一个对上,很好理解
    ynyounuo
        23
    ynyounuo  
       2016-06-30 17:19:16 +08:00
    @pyengwoei
    并不,没有时间
    pyengwoei
        24
    pyengwoei  
    OP
       2016-06-30 17:21:42 +08:00
    @maijiawei 是的,主要是 JS 这个写法太票 函数作为 for 循环变量,看不太明白,自己试着改成 C#最后带入 var a = "60o0749460o07134482"; 都解密不成功,解密成功会返回
    value: d,
    winner: f,
    playerPair:
    bankerPair:
    这个 object
    pyengwoei
        25
    pyengwoei  
    OP
       2016-06-30 17:25:12 +08:00
    @ynyounuo 我 QQ : 1069689491 我可以付费
    ToughGuy
        26
    ToughGuy  
       2016-06-30 17:47:47 +08:00   ❤️ 1
    base64 解码下, 我懒得处理对齐。

    不是程序, 狗逼运维一个, 你对下程序结果和 JS 是否一致。


    IyEvdXNyL2Jpbi9lbnYgcHl0aG9uCiMgLSotIGNvZGluZzogdXRmLTggLSotCgppbXBvcnQganNv
    bgoKCmRlZiB0b19pbnQodmFsMSk6CiAgICB0cnk6CiAgICAgICAgcmV0dXJuIGludCh2YWwxKQog
    ICAgZXhjZXB0IFZhbHVlRXJyb3I6CiAgICAgICAgcmV0dXJuIG9yZCh2YWwxKSAtIG9yZCgnYScp
    ICsgMTAKCgpkZWYgY2FsYyhhLCBiKToKICAgIGMgPSB0b19pbnQoYVtiXSkKICAgIGQgPSB0b19p
    bnQoYVtiICsgMV0pCiAgICBlID0gMTUgJiBkCiAgICBmID0gKDEyICYgYykgPj4gMgogICAgZyA9
    ICgyICYgYykgPiAwCiAgICBoID0gKDEgJiBjKSA+IDAKCiAgICByZXR1cm4gewogICAgICAgICd2
    YWx1ZSc6IGUsCiAgICAgICAgJ3dpbm5lcic6IGYsCiAgICAgICAgJ3BsYXllclBhaXInOiBnLAog
    ICAgICAgICdiYW5rZXJQYWlyJzogaAogICAgfQoKCmRlZiBnKHgsIHkpOgogICAgZGVmIGIoYyk6
    CiAgICAgICAgZCA9IFtdCiAgICAgICAgZSA9IDMKICAgICAgICBmb3IgZiBpbiByYW5nZSgwLCBs
    ZW4oYykgLSAxLCAyKToKICAgICAgICAgICAgZyA9IGNhbGMoYywgZikKICAgICAgICAgICAgaWYg
    Z1snd2lubmVyJ10gIT0gZToKICAgICAgICAgICAgICAgIGQuYXBwZW5kKGcpCiAgICAgICAgICAg
    IGVsc2U6CiAgICAgICAgICAgICAgICBkID0gW10KICAgICAgICByZXR1cm4gZAoKICAgIHJldHVy
    biB7CiAgICAgICAgJzdiYWwnOiB5LAogICAgICAgICdiYWwnOiBiKHkpLAogICAgICAgICdyb2wn
    OiB5LAogICAgICAgICdyb2ZsJzogW3sncmVzdWx0Jzogen0gZm9yIHogaW4geS5zcGxpdCgnOycp
    XSwKICAgIH0uZ2V0KHgsIHkpCgoKaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKICAgIHMgPSAn
    NjBvMDc0OTQ2MG8wNzEzNDQ4MicKICAgIHByaW50IGpzb24uZHVtcHMoZygnYmFsJywgcyksIGlu
    ZGVudD00KQo=
    pyengwoei
        27
    pyengwoei  
    OP
       2016-06-30 18:00:41 +08:00
    @ToughGuy V2EX 还是有高手的,太感谢了。我看了但是还没测试,等程序回来了测试成功,我私信你,你方便给我一个你支付宝么
    ToughGuy
        28
    ToughGuy  
       2016-06-30 18:02:29 +08:00   ❤️ 1
    不用支付宝啦, 我就满足下自己的好奇心, 代码有没有 BUG 我还不知道呢。
    995573753
        29
    995573753  
       2016-06-30 18:13:22 +08:00
    lz 不确定的话,放在.NET 里用 V8 调用就可以了。
    995573753
        30
    995573753  
       2016-06-30 18:16:56 +08:00
    要是不清楚的话,参考下这个:
    http://www.cnblogs.com/yjmyzz/p/3359204.html
    xqin
        31
    xqin  
       2016-06-30 19:22:57 +08:00   ❤️ 1
    @ToughGuy python 代码有 bug.
    对 switch 那里翻译的不对.

    7bal/bal 要执行一样的操作
    rol 和 rofl 也是执行同样的操作

    而现在的代码不是.
    ```
    return {
    '7bal': y,
    'bal': b(y),
    'rol': y,
    'rofl': [{'result': z} for z in y.split(';')],
    }.get(x, y)

    ```
    omengye
        32
    omengye  
       2016-06-30 20:39:41 +08:00   ❤️ 1
    写了个 java 版的,这个思路应该会清晰点
    https://gist.github.com/omengye/eb67eea5989faab33f041315a66fa5f4
    anoymoux
        33
    anoymoux  
       2016-06-30 20:41:01 +08:00
    百家乐? 黑产?
    gleox
        34
    gleox  
       2016-06-30 23:48:23 +08:00   ❤️ 1
    不想写代码了,我直接阐述原理吧。

    'bal'作为算法的决策条件,没什么可说的。选择的算法如下:

    ** 把最外层字符串变量 a 的值按 2 个字符拆分,然后解析到最后结果数组的每个对象。

    先说下 for 循环里 e 函数

    这个函数接受一个字符,把字符转换数字,内部会作如下判断

    * 如果字符是 0-10 的数字字符串,转到原数字
    * 如果不是 0-10 的数字字符串,取字符的 ASSCI 码减去 a 的 ASSCI 码,再加上 10 返回,公式
    ```
    // ASSCI(str) - 87 -- a 的 ASSCI 码是 97
    ASSCI(str) - ASSCI(a) + 10
    ```

    回到刚才说到的 2 个字符解析。 for 循环会把 2 个字符的依次传给上面提到的函数 e ,把值保存到两个变量 c,d
    ```
    c = 第 1 个字符转换的数字
    d = 第 2 个字符转换的数字
    ```
    接着,用变量 d 与 15 做二进制与运算, 15 的二进制是 4 个 1(1111),也就是取 d 的最后 4 个二进制位。
    把这个 4 个二进制代表的值赋值给最后结果对象的 value 属性

    用变量 c 与 12 , 2 , 1 这 3 个数字作二进制与运算,这 3 个数字的二进制分别是'1100'、 '10'、'1'。
    * 用 12 和 c 作与运算后又把数字向右偏移了 2 位,其实就是取数字的第 3 、 4 两个二进制位,
    把这两个二进制位表示的值赋值给最后对象的 winner 属性
    * 用 2 和 c 作与运算后,其实取出了数字的第 2 个二进制位,然后判断是否大于 0(其实就是第 2 个二进制位有值就表示 true),结果赋值给最后对象的 playerPair
    * 用 1 和 c 作运算,原理同上面的 2 一样,只是取得是数字的第 1 个二进制位,结果赋值给对面的 bankerPair 属性

    上面的对象属性解析对应如下:

    value: 取 2 个字符的第 2 个字符的数值的第 1 到第 4 的二进制位
    winner: 取 2 个字符的第 1 个字符的数值的第 3 、 4 两个二进制位
    playerPair: 取 2 个字符的第 1 个字符的数值的第 2 个二进制位,如果有值就是 true
    bankerPair :同 playerPair 取值很相似,区别在于取值位置是第 1 个二进制位

    在 for 循环里,对象创建完成后,用对象的 winner 属性和数字 3 作比较。
    * 如果等于 3 ,就重置最后的结果数组
    * 如果不等于 3 ,就把对象压栈到最后的结果数组的最后一位

    循环完后,返回对象数组。

    总算写完了,想的时候没猜到写这么多。希望了帮到露珠 :)
    pyengwoei
        35
    pyengwoei  
    OP
       2016-07-01 09:07:01 +08:00
    @ToughGuy
    你发我吧,没事
    pyengwoei
        36
    pyengwoei  
    OP
       2016-07-01 09:19:11 +08:00
    @gleox 谢了帮了大忙,呵呵
    pyengwoei
        37
    pyengwoei  
    OP
       2016-07-01 09:19:39 +08:00
    @omengye 感谢 感谢(づ ̄ 3  ̄)づ╭❤~
    toono
        38
    toono  
       2016-07-01 09:30:52 +08:00
    @gleox 厉害
    pyengwoei
        39
    pyengwoei  
    OP
       2016-07-01 09:55:56 +08:00
    @995573753 好的 谢谢
    pyengwoei
        40
    pyengwoei  
    OP
       2016-07-01 10:04:14 +08:00
    @anoymoux 只是一个游戏数据的解密,不是黑产
    jsq2627
        41
    jsq2627  
       2016-07-01 23:51:45 +08:00
    pyengwoei
        42
    pyengwoei  
    OP
       2016-07-07 15:24:43 +08:00
    @jsq2627 非常感谢 O(∩_∩)O~~,不过代码我运行起来 有报错
    string aa = "8612270pa982064o";
    List<ResultItem> rs = Decode(aa,"22016");

    报错得是这一句
    default:
    throw new NotSupportedException(mode);

    未处理 System.NotSupportedException
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2840 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 00:29 · PVG 08:29 · LAX 17:29 · JFK 20:29
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.