LINUX.ORG.RU

Преобразовать javascript-код в php


0

1

Доброго времени суток всем! Может вопрос немного и туповат, но все же помогите пожалуйста разобраться с преобразованием функции яваскрипта в эквивалентную php-функцию. Вот собственно javascript:

function tvprog_encode(str) {
    var s = '', k;
    for (var i = 0; i < str.length; i++) {
        k = str.charCodeAt(i) + tvprog_user;
        while (k > 255) k -= 255;
        s += String.fromCharCode(k);
    }
    var tab = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
    var out = "", c1, c2, c3, e1, e2, e3, e4;
    for (var i = 0; i < s.length; ) {
       c1 = s.charCodeAt(i++); c2 = s.charCodeAt(i++); c3 = s.charCodeAt(i++);
       e1 = c1 >> 2; e2 = ((c1 & 3) << 4) + (c2 >> 4); e3 = ((c2 & 15) << 2) + (c3 >> 6);
       e4 = c3 & 63;
       if (isNaN(c2))
         e3 = e4 = 64;
       else if (isNaN(c3))
         e4 = 64;
       out += tab.charAt(e1) + tab.charAt(e2) + tab.charAt(e3) + tab.charAt(e4);
    }
    return out;
}
Вот то, что мне удалось преобразовать:
function encode_str($str, $tvuser)
{
	$s = '';
	for($i=0; $i<strlen($str); $i++)
	{
		$k = ord($str{$i}) + $tvuser;
		while($k > 255) $k -= 255;
		$s .= chr($k);
	}
	$tab = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
	$out = '';
	for($i=0; $i<strlen($s); $i++)
	{
		$c1 = ord($s{$i++});
		$c2 = ord($s{$i++});
		$c3 = ord($s{$i++});
		$e1 = $c1 >> 2;
		$e2 = (($c1 & 3) << 4) + ($c2 >> 4);
		$e3 = (($c2 & 15) << 2) + ($c3 >> 6);
		$e4 = $c3 & 63;
		if(!is_numeric($c2)) $e3 = $e4 = 64;
		elseif(!is_numeric($c3)) $e4 = 64;
		$out .= $tab{$e1} . $tab{$e2} . $tab{$e3} . $tab{$e4};
	}
	return $out;
}
Для примера $tvuser = 133; $str = 'jtv/08.08.2011_2' На выходе c этими параметрами функция должна выдавать строку: «7/n7tLW9s7W9s7e1trbktw==» Но в php выдает только ее часть и то каким-то непонятным образом: «7/n7tb2zvbO3trbk» Подозреваю, что проблема кроется в операторе запятая в яваскрипте, но как его реализовать в php?


сравни:

for (var i = 0; i < s.length; ) {
и
for($i=0; $i<strlen($s); $i++)

уже понятно, где ошибка?

aol ★★★★★
()
Ответ на: комментарий от anonymous

спасибо!

заменил в php на for($i=0;$i<strlen($s)) и стало выдавать «7/n7tLW9s7W9s7e1trbktwAA», что уже больше похоже на истину. Но там два последних символа должны быть «=»...

inox
() автор топика

За этот код автору нужно оторвать голову и отправить в обратно в школу.

<?php

$tvuser = 133;
$s = 'jtv/08.08.2011_2';
$ss = '';

for($i=0; $i < strlen($s); $i++) {
    $k = ord($s[$i]) + $tvuser;
    while($k > 255) {
        $k -= 255;
    }

    $ss .= chr($k);
}

$r = base64_encode($ss); // Here is it!

var_dump($r);
$ php foo.php
string(24) "7/n7tLW9s7W9s7e1trbktw=="
urxvt ★★★★★
()
Ответ на: комментарий от inox

Всегда пожалуйста.
Автора яваскрипта конечно же :) Просто вместо того чтобы использовать стандартную реализацию base64 он навелосипедил ее снова.

urxvt ★★★★★
()
Ответ на: комментарий от inox

И замените лучше

while($k > 255) {
    $k -= 255;
}

на

$k = $k % 255;

urxvt ★★★★★
()
Ответ на: комментарий от urxvt

Это где в жаваскрипте стандартная реализация base64? Все, что гуглится - есть сторонние реализации лагоритма на самом жаваскрипте.

GateKeeper ★★
()
Ответ на: комментарий от GateKeeper

Ааа... Понял.
Извиняюсь перед автором js-кода.

urxvt ★★★★★
()
Ответ на: комментарий от GateKeeper

трололо

> console.log(new Buffer("Hello World").toString('base64'));
SGVsbG8gV29ybGQ=
> console.log(new Buffer("SGVsbG8gV29ybGQ=", 'base64').toString('ascii'))
Hello World

node.js

stevejobs ★★★★☆
()
Ответ на: комментарий от anonymous

я что то не понял почему в js нет '; i++' а в php надо? пробовал несколько раз JS без '; i++' но это привело к зависанию браузера по понятным причинам.

psp13
()
Ответ на: комментарий от stevejobs
{
Перечитай еще раз выделенное полужирным слово поста, на который изначально отвечал ты.
Потом еще раз прочитай ECMA-262.
} while (непонятно)
GateKeeper ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.