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

2016-06-30 16:11:24 +08:00
 pyengwoei
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));
8123 次点击
所在节点    程序员
42 条回复
pyengwoei
2016-06-30 17:12:38 +08:00
@maijiawei 对是解密的
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
2016-06-30 17:19:16 +08:00
@pyengwoei
并不,没有时间
pyengwoei
2016-06-30 17:21:42 +08:00
@maijiawei 是的,主要是 JS 这个写法太票 函数作为 for 循环变量,看不太明白,自己试着改成 C#最后带入 var a = "60o0749460o07134482"; 都解密不成功,解密成功会返回
value: d,
winner: f,
playerPair:
bankerPair:
这个 object
pyengwoei
2016-06-30 17:25:12 +08:00
@ynyounuo 我 QQ : 1069689491 我可以付费
ToughGuy
2016-06-30 17:47:47 +08:00
base64 解码下, 我懒得处理对齐。

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


IyEvdXNyL2Jpbi9lbnYgcHl0aG9uCiMgLSotIGNvZGluZzogdXRmLTggLSotCgppbXBvcnQganNv
bgoKCmRlZiB0b19pbnQodmFsMSk6CiAgICB0cnk6CiAgICAgICAgcmV0dXJuIGludCh2YWwxKQog
ICAgZXhjZXB0IFZhbHVlRXJyb3I6CiAgICAgICAgcmV0dXJuIG9yZCh2YWwxKSAtIG9yZCgnYScp
ICsgMTAKCgpkZWYgY2FsYyhhLCBiKToKICAgIGMgPSB0b19pbnQoYVtiXSkKICAgIGQgPSB0b19p
bnQoYVtiICsgMV0pCiAgICBlID0gMTUgJiBkCiAgICBmID0gKDEyICYgYykgPj4gMgogICAgZyA9
ICgyICYgYykgPiAwCiAgICBoID0gKDEgJiBjKSA+IDAKCiAgICByZXR1cm4gewogICAgICAgICd2
YWx1ZSc6IGUsCiAgICAgICAgJ3dpbm5lcic6IGYsCiAgICAgICAgJ3BsYXllclBhaXInOiBnLAog
ICAgICAgICdiYW5rZXJQYWlyJzogaAogICAgfQoKCmRlZiBnKHgsIHkpOgogICAgZGVmIGIoYyk6
CiAgICAgICAgZCA9IFtdCiAgICAgICAgZSA9IDMKICAgICAgICBmb3IgZiBpbiByYW5nZSgwLCBs
ZW4oYykgLSAxLCAyKToKICAgICAgICAgICAgZyA9IGNhbGMoYywgZikKICAgICAgICAgICAgaWYg
Z1snd2lubmVyJ10gIT0gZToKICAgICAgICAgICAgICAgIGQuYXBwZW5kKGcpCiAgICAgICAgICAg
IGVsc2U6CiAgICAgICAgICAgICAgICBkID0gW10KICAgICAgICByZXR1cm4gZAoKICAgIHJldHVy
biB7CiAgICAgICAgJzdiYWwnOiB5LAogICAgICAgICdiYWwnOiBiKHkpLAogICAgICAgICdyb2wn
OiB5LAogICAgICAgICdyb2ZsJzogW3sncmVzdWx0Jzogen0gZm9yIHogaW4geS5zcGxpdCgnOycp
XSwKICAgIH0uZ2V0KHgsIHkpCgoKaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKICAgIHMgPSAn
NjBvMDc0OTQ2MG8wNzEzNDQ4MicKICAgIHByaW50IGpzb24uZHVtcHMoZygnYmFsJywgcyksIGlu
ZGVudD00KQo=
pyengwoei
2016-06-30 18:00:41 +08:00
@ToughGuy V2EX 还是有高手的,太感谢了。我看了但是还没测试,等程序回来了测试成功,我私信你,你方便给我一个你支付宝么
ToughGuy
2016-06-30 18:02:29 +08:00
不用支付宝啦, 我就满足下自己的好奇心, 代码有没有 BUG 我还不知道呢。
995573753
2016-06-30 18:13:22 +08:00
lz 不确定的话,放在.NET 里用 V8 调用就可以了。
995573753
2016-06-30 18:16:56 +08:00
要是不清楚的话,参考下这个:
http://www.cnblogs.com/yjmyzz/p/3359204.html
xqin
2016-06-30 19:22:57 +08:00
@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
2016-06-30 20:39:41 +08:00
写了个 java 版的,这个思路应该会清晰点
https://gist.github.com/omengye/eb67eea5989faab33f041315a66fa5f4
anoymoux
2016-06-30 20:41:01 +08:00
百家乐? 黑产?
gleox
2016-06-30 23:48:23 +08:00
不想写代码了,我直接阐述原理吧。

'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
2016-07-01 09:07:01 +08:00
@ToughGuy
你发我吧,没事
pyengwoei
2016-07-01 09:19:11 +08:00
@gleox 谢了帮了大忙,呵呵
pyengwoei
2016-07-01 09:19:39 +08:00
@omengye 感谢 感谢(づ ̄ 3  ̄)づ╭❤~
toono
2016-07-01 09:30:52 +08:00
@gleox 厉害
pyengwoei
2016-07-01 09:55:56 +08:00
@995573753 好的 谢谢
pyengwoei
2016-07-01 10:04:14 +08:00
@anoymoux 只是一个游戏数据的解密,不是黑产

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/289369

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX