一小段 js 代码翻译成 Python 或者 C#,谢谢了 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
pyengwoei
V2EX    程序员

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

  •  
  •   pyengwoei 2016-06-30 16:11:24 +08:00 8517 次点击
    这是一个创建于 3389 天前的主题,其中的信息可能已经有所发展或是发生改变。
    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
    O3YwA1ENkb7i35XJ
        31
    O3YwA1ENkb7i35XJ  
       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     Solana     1253 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 29ms UTC 23:52 PVG 07:52 LAX 16:52 JFK 19:52
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86