декодировать последовательность JavaScript в Python - PullRequest
0 голосов
/ 25 ноября 2011

Я новичок в Python, пытающийся декодировать эту последовательность JavaScript. Я не только новичок в Python, я даже меньше понимаю javascript :) Я знаю, что могу поместить его в онлайн-декодер, такой как этот: http://coderstoolbox.net/string/, но я хочу разобраться с этим сам - больше для практики, чем что-нибудь еще ... Я использую Beautiful Soup для получения данных, поэтому у меня есть его функции для декодирования.

Если кто-нибудь может указать мне на эквивалентные функции в python, я был бы признателен.

function encode(str){
 var t=''; var s=unescape(str);
 var x=Math.round(Math.sqrt(49));
 for(var i=0;i<s.length;i++) t+=
  String.fromCharCode(s.charCodeAt(i)^(i%2?x:0));
 print(t);
}

Это мое понимание этого до сих пор:

  1. Я думаю, что я могу использовать 'сущности HTML в BS, чтобы удалиться?
  2. второй кажется постоянным числом? квадратный корень из 49 округленных ...
  3. устанавливает цикл
  4. это тот, который я не получаю. 1 Я не знаю, что делает функция fromCharCode. 2 не уверен, что бит в конце. Похоже, он получает символьный код от меня к власти что-то. я понимаю, что меняли по модулю с 2, но что такое бит??: 0? - Как бы вы повторили это в Python?

спасибо за чтение!

РЕДАКТИРОВАТЬ: есть ли библиотека Python, которая может просто запустить этот код? Я делал это раньше с bash и использовал носорога, но альтернативы в Python кажутся немного пугающими для новичка, например, spidermonkey и т.д ...

Ответы [ 2 ]

0 голосов
/ 25 ноября 2011

1) эквивалент Python для unescape равен urllib.unquote () в серии Python 2.x и urllib.parse.unquote () в серии Python 3.x

2) Вы думаете, что самый простой способ сделать это - сделать x = 7

3) самый простой способ зацикливаться на строковых хартиях - это сделать for c in string:, но чтобы иметь индекс, вы должны сделать for i,c in enumerate(string):

4) string.charChodeAt (c) совпадает с chr (c)

наконец, я дублирую часть цикла следующим образом:

result = []
for i,c in enumerate(string):
    result.append(chr(ord(c)^(x if i%2 else 0)))
print("".join(result))

на самом деле использование временного массива для создания добавок более эффективно, чем для строк, поскольку строки не изменяются

0 голосов
/ 25 ноября 2011

Я не знаю Python, но я могу объяснить, что здесь происходит, чтобы вы могли переписать на Python.

1) функция кодирования объявлена, а не назначена, поэтому в JavaScript она поднимется наверх своей родительской функции, если она есть.

2) Внутри функции кодирования есть 4 переменные, которые будут подняты в начало функции кодирования:

  • t, который присваивается пустой строке, что означает длину 0, но тип - строка
  • s, которому присваивается значение аргумента "str", которое передается через функцию unencode. unencode просто инвертирует зарезервированную URI кодировку символов.
  • x, который имеет номер типа со значением 7
  • i, которому присвоено 0 и которое используется в качестве итератора цикла

3) Индекс цикла начинается с 0 и заканчивается не позднее, чем индекс имеет тот же размер, что и длина символа в переменной s.

4) Цикл написан небрежно, без фигурных скобок, поэтому он заканчивается на первом разрыве строки, что означает, что переменная t выполняет строку concat в отражении переменной s.

5) Следующая строка, начинающаяся с объекта string, выглядит так, как будто он должен быть в цикле, но это не так, потому что этот код небрежный. В любом случае это не имеет значения, потому что переменная s на самом деле больше не используется.

6) Функция печати используется с переменной t в качестве аргумента. Переменная t должна выглядеть идентично переменной s, что, вероятно, не то, что предполагал первоначальный автор этого кода.

7) Понятия не имею, что такое печать. Возможно, оригинальный автор имел в виду что-то вроде alert или console.log вместо print.

...