2016-07-06 144 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