2016-07-06 150 views
1

这是java脚本代码,它是一个具有2个功能的解码器:
getOffset,以及主要功能asdf将JavaScript代码转换为Python

我想这个字符串解码:LqMWJQzZYUWJQpEcYGII26XombQQoqnQQQQoqnqgoqnQQQQoqnQQQQoqnQQQQoqnqgoqnQQQQoqnQQuuuQQoqnQQQQoqnxioqnQQQQoqnQQMJCSVcCgnQQoqnQQQQoqnxioqnQQQQoqnQQniaQQoqnQQQQoqnqgoqnQQQQoqnQQWJQzhYAUoVMTAdAT33nvX3nB

要这样:

/ShowUrl-a_partnerKey.1-a_url.http%253A__5F____5F__2F__5F____5F____5F____5F__2F__5F____5F__www__5F____5F__2E__5F____5F__danielnyc__5F____5F__2E__5F____5F__com__5F____5F__2F__5F____5F__-a_urlKey.915edf949f66c826c.html

我想转换这个(工作)的JavaScript代码到Python:

var d = "LqMWJQzZYUWJQpEcYGII26XombQQoqnQQQQoqnqgoqnQQQQoqnQQQQoqnQQQQoqnqgoqnQQQQoqnQQuuuQQoqnQQQQoqnxioqnQQQQoqnQQMJCSVcCgnQQoqnQQQQoqnxioqnQQQQoqnQQniaQQoqnQQQQoqnqgoqnQQQQoqnQQWJQzhYAUoVMTAdAT33nvX3nB" 
function asdf(d) { 
var h = { 
    "": ["&", "=", "p", "6", "?", "H", "%", "B", ".com", "k", "9", ".html", "n", "M", "r", "www.", "h", "b", "t", "a", "0", "/", "d", "O", "j", "http://", "_", "L", "i", "f", "1", "e", "-", "2", ".", "N", "m", "A", "l", "4", "R", "C", "y", "S", "o", "+", "7", "I", "3", "c", "5", "u", 0, "T", "v", "s", "w", "8", "P", 0, "g", 0], 
    q: [0, "__3F__", 0, "Photos", 0, "https://", ".edu", "*", "Y", ">", 0, 0, 0, 0, 0, 0, "`", "__2D__", "X", "<", "slot", 0, "ShowUrl", "Owners", 0, "[", "q", 0, "MemberProfile", 0, "ShowUserReviews", '"', "Hotel", 0, 0, "Expedia", "Vacation", "Discount", 0, "UserReview", "Thumbnail", 0, "__2F__", "Inspiration", "V", "Map", ":", "@", 0, "F", "help", 0, 0, "Rental", 0, "Picture", 0, 0, 0, "hotels", 0, "ftp://"], 
    x: [0, 0, "J", 0, 0, "Z", 0, 0, 0, ";", 0, "Text", 0, "(", "x", "GenericAds", "U", 0, "careers", 0, 0, 0, "D", 0, "members", "Search", 0, 0, 0, "Post", 0, 0, 0, "Q", 0, "$", 0, "K", 0, "W", 0, "Reviews", 0, ",", "__2E__", 0, 0, 0, 0, 0, 0, 0, "{", "}", 0, "Cheap", ")", 0, 0, 0, "#", ".org"], 
    z: [0, "Hotels", 0, 0, "Icon", 0, 0, 0, 0, ".net", 0, 0, "z", 0, 0, "pages", 0, "geo", 0, 0, 0, "cnt", "~", 0, 0, "]", "|", 0, "tripadvisor", "Images", "BookingBuddy", 0, "Commerce", 0, 0, "partnerKey", 0, "area", 0, "Deals", "from", "//", 0, "urlKey", 0, "'", 0, "WeatherUnderground", 0, "MemberSign", "Maps", 0, "matchID", "Packages", "E", "Amenities", "Travel", ".htm", 0, "!", "^", "G"] 
}; 
var b = ""; 
for (var a = 0; a < d.length; a++) { 
    var j = d.charAt(a); 
    var f = j; 
    if (h[j] && a + 1 < d.length) { 
     a++; 
     f += d.charAt(a) 
    } else { 
     j = "" 
    } 
    var g = getOffset(d.charCodeAt(a)); 
    if (g < 0 || typeof h[j][g] == "String") { 
     b += f 
    } else { 
     b += h[j][g] 
    } 
} 
return b} 
function getOffset(a) { 
if (a >= 97 && a <= 122) { 
    return a - 61 
} 
if (a >= 65 && a <= 90) { 
    return a - 55 
} 
if (a >= 48 && a <= 71) { 
    return a - 48 
} 
return -1} 
asdf(d) 

它返回(如预期):

/ShowUrl-a_partnerKey.1-a_url.http%253A__5F____5F__2F__5F____5F____5F____5F__2F__5F____5F__www__5F____5F__2E__5F____5F__danielnyc__5F____5F__2E__5F____5F__com__5F____5F__2F__5F____5F__-a_urlKey.915edf949f66c826c.html

这是我试过的Python代码:

d = "LqMWJQzZYUWJQpEcYGII26XombQQoqnQQQQoqnqgoqnQQQQoqnQQQQoqnQQQQoqnqgoqnQQQQoqnQQuuuQQoqnQQQQoqnxioqnQQQQoqnQQMJCSVcCgnQQoqnQQQQoqnxioqnQQQQoqnQQniaQQoqnQQQQoqnqgoqnQQQQoqnQQWJQzhYAUoVMTAdAT33nvX3nB" 

def asdf(d): 

h = { 
"" : ["&", "=", "p", "6", "?", "H", "%", "B", ".com", "k", "9", ".html", "n", "M", "r", "www.", "h", "b", "t", "a", "0", "/", "d", "O", "j", "http://", "_", "L", "i", "f", "1", "e", "-", "2", ".", "N", "m", "A", "l", "4", "R", "C", "y", "S", "o", "+", "7", "I", "3", "c", "5", "u", 0, "T", "v", "s", "w", "8", "P", 0, "g", 0], 
"q": [0, "__3F__", 0, "Photos", 0, "https://", ".edu", "*", "Y", ">", 0, 0, 0, 0, 0, 0, "`", "__2D__", "X", "<", "slot", 0, "ShowUrl", "Owners", 0, "[", "q", 0, "MemberProfile", 0, "ShowUserReviews", '"', "Hotel", 0, 0, "Expedia", "Vacation", "Discount", 0, "UserReview", "Thumbnail", 0, "__2F__", "Inspiration", "V", "Map", ":", "@", 0, "F", "help", 0, 0, "Rental", 0, "Picture", 0, 0, 0, "hotels", 0, "ftp://"], 
"x": [0, 0, "J", 0, 0, "Z", 0, 0, 0, ";", 0, "Text", 0, "(", "x", "GenericAds", "U", 0, "careers", 0, 0, 0, "D", 0, "members", "Search", 0, 0, 0, "Post", 0, 0, 0, "Q", 0, "$", 0, "K", 0, "W", 0, "Reviews", 0, ",", "__2E__", 0, 0, 0, 0, 0, 0, 0, "{", "}", 0, "Cheap", ")", 0, 0, 0, "#", ".org"], 
"z": [0, "Hotels", 0, 0, "Icon", 0, 0, 0, 0, ".net", 0, 0, "z", 0, 0, "pages", 0, "geo", 0, 0, 0, "cnt", "~", 0, 0, "]", "|", 0, "tripadvisor", "Images", "BookingBuddy", 0, "Commerce", 0, 0, "partnerKey", 0, "area", 0, "Deals", "from", "//", 0, "urlKey", 0, "'", 0, "WeatherUnderground", 0, "MemberSign", "Maps", 0, "matchID", "Packages", "E", "Amenities", "Travel", ".htm", 0, "!", "^", "G"] 
} 
b = "" 

for a in range(len(d)): 
    j=d[a] 
    f=j 
    list =[] 
    for key in h: 
     list.append(key) 
    if j in list and a+1 < len(d): 
     a=a+1 
     f = f+d[a] 
    else: 
     j = "" 
    g = getOffset(ord(d[a])) 
    if g < 0 or type(h[j][g]) is str: 
     b = b + f 
    else: 
     b = b+str(h[j][g]) 
     print b 
return b 

def getOffset(a): 
    if(a >= 97 and a <= 122): 
     return(a-61)   
    if(a >= 65 and a <= 90): 
     return(a-55) 
    if(a >= 48 and a <=71): 
     return(a-48) 
    return(-1) 
print asdf(d) 

但它给我回的未解码的字符串:LqMWJQzZYUWJQpEcYGII26XombQQoqnQQQQoqnqgoqnQQQQoqnQQQQoqnQQQQoqnqgoqnQQQQoqnQQuuuQQoqnQQQQoqnxioqnQQQQoqnQQMJCSVcCgnQQoqnQQQQoqnxioqnQQQQoqnQQniaQQoqnQQQQoqnqgoqnQQQQoqnQQWJQzhYAUoVMTAdAT33nvX3nB

这有什么错我的代码?为什么我不能获得与javascript代码相同的结果?

+0

其实,你的Javascript代码有一个Eo = rror--如果错误得到解决,那么你的JS代码就会中断,返回原始字符串,就像你的Python代码一样。如果(g <0 || typeof h [j] [g] ==“string”)'(note notcapitalized ** string ** if(g <0 || typeof h [j] [g] ==“string”)' ) – SherylHohman

+0

其次,你的Python代码仍然不会完全符合你期望的结果,因为当使用'for in ..'构造时,循环变量的值将自己重置为“下一个”值(忽略所做的任何更改在块内),给你带来麻烦的结果。使用'for .. in ..'的方式与使用JavaScript'forEach'相同的方式不要更改循环变量的值,代码期望迭代器中的每个元素都将被执行(使用'break '),或者如果你想在Python中手动控制循环变量的值,可以使用'while'循环。 – SherylHohman

回答

1

实际上,您的Javascript代码有一个错误 - 如果错误得到解决,那么您的JS代码会中断,返回原始字符串,就像您的Python代码一样。

if (g < 0 || typeof h[j][g] == "String")并不表现为你所期望:

typeof h[j][g] == "String")应该
if (g < 0 || typeof h[j][g] == "string")
(注意小写形式)。

事实上的错误typeof h[j][g] == "String"),实际上是
if (g < 0) {...

如果您更改代码的两个版本那行,你得到想要的结果在JS的等效,而且几乎在Python所期望的结果(这有另一个错误)。


的JavaScript版本

变化:

var g = getOffset(d.charCodeAt(a)); 
    if (g < 0 || typeof h[j][g] == "String") {  #THIS LINE IS INCORRECT 
     b += f 
    } else { 
     b += h[j][g] 
    } 

要:

var g = getOffset(d.charCodeAt(a)); 
    if (g < 0){      # CHANGE THIS LINE 
     b += f 
    } else { 
     b += h[j][g] 
    } 

JS结果:

/ShowUrl-a_partnerKey.1-a_url.http%253A__5F____5F__2F__5F____5F____5F____5F__2F__5F____5F__www__5F____5F__2E__5F____5F__danielnyc__5F____5F__2E__5F____5F__com__5F____5F__2F__5F____5F__-a_urlKey.915edf949f66c826c.html


Python版本

变化:

g = getOffset(ord(d[a])) 
if g < 0 or type(h[j][g]) is str: # THIS LINE IS INCORRECT 
    b = b + f 
else: 
    b = b+str(h[j][g]) 
    print b       # THIS LINE SHOULD BE REMOVED 

要:

g = getOffset(ord(d[a]))    # CHANGED THIS LINE 
if g < 0: 
    b = b + f 
else: 
    b = b+str(h[j][g]) 
    #print b       # REMOVED THIS LINE 

结果:

/ShowUrld-a_partnerKeyN.1-a_url.http%253A__5Fc____5Fc__2F__y5Fc____5Fc____5Fc____5Fc__2F__y5Fc____5Fc__www__5Fc____5Fc__2E__o5Fc____5Fc__danielnyc__5Fc____5Fc__2E__o5Fc____5Fc__com__5Fc____5Fc__2F__y5Fc____5Fc__-a_urlKeyS.915edf949f66c826c.html

这里是链接到最终代码:


最终PYTHON修复

现在,你有anoth呃Python的错误.. 当使用for a in ..结构,你不能改变内部的a值,如行:a = a + 1

好了,你可以,但会导致意想不到的结果。
达到for a in..顶循环的每一次,什么珍惜你暂时改成了循环a将递增到下一个值就将不得不,不管!

因此,(2, 'M'), (7, 'Z'), ...没有跳过,你本来打算!
这就是为什么我上面显示的Python结果有更多的字符超出了你的预期。

参见these SO answers for great explanations and examplespython docs herethis closed SO question

在这种情况下转换代码的最简单方法是简单地使用while循环代替for in循环。这样,你的内在逻辑在两种语言上基本保持不变。

CHANGE:

#for a in range(len(d)):  ## Remove and Change this to a WHILE loop as below 
    a = 0      # Manually initialize your loop 
    print(len(d)) 
    while a < len(d):   # Use WHILE loop instead 
    j = d[a] 

    ... 

和..

... 

    g = getOffset(ord(d[a])) 
    if g < 0 :     # Remember to UPDATE This Line (Remove #or type(h[j][g]) is str:) 
     b = b + f 
    else: 
     b = b + str(h[j][g]) 
     #print b     # REMOVE this line 

    a = a + 1      # Manually increment your WHILE loop 
    return b 

FINAL PYTHON CODE on REPL.IT

FINAL PYTHON结果:

/ShowUrl-a_partnerKey.1-a_url.http%253A__5F____5F__2F__5F____5F____5F____5F__2F__5F____5F__www__5F____5F__2E__5F____5F__danielnyc__5F____5F__2E__5F____5F__com__5F____5F__2F__5F____5F__-a_urlKey.915edf949f66c826c.html