[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Кто знает? ;)
vital
Сегодня на работе переписывал с php на js кусок скрипта, убил много времени на проблему новичков ;) Кто может сходу(!) сказать:

Скажем, есть код на пхп и на js

$i=5;
$var1 ="This is String 1";
$var2 ="This is String 2";
$var3 = ord($var1{$i}^$var2{$i});
echo $var3;


var var1, var2, var3, i;
i=5;
var1 ="This is String 1";
var2 ="This is String 2";
var3 = ord(var1[i]^var2[i]); //ord - реализованный на js аналог пхпшной. По сути charCodeAt();
console.log(var3);

Одинаковые(и какие?) ли будут результаты и почему?
Такая вот темка в напоминание)



Спустя 9 минут, 18 секунд (6.12.2011 - 21:55) TranceIT написал(а):
В js эта функция возвращает Unicode коды символов, в php возвращает ANSCII.

Точно не знаю, но смею предположить, что вывод будет одинаков за исключением пробелов, т. к. юникод и ANSCII позиции латинницы и цифр совпадают...

Спустя 1 минута, 25 секунд (6.12.2011 - 21:57) vital написал(а):
Цитата (TranceIT @ 6.12.2011 - 20:55)
В js эта функция возвращает Unicode коды символов, в php возвращает ANSCII.

Оба ord()-а возвращают одинаково. Читаем комментарии. Соль не там, следующий.

Спустя 9 минут, 36 секунд (6.12.2011 - 22:06) vital написал(а):
Цитата
Точно не знаю, но смею предположить, что вывод будет одинаков за исключением пробелов, т. к. юникод и ANSCII позиции латинницы и цифр совпадают...

Нет.

Спустя 7 минут, 50 секунд (6.12.2011 - 22:14) Игорь_Vasinsky написал(а):
может в 'крышке' дело?

JS
Цитата
Ставит 1 для каждого бита результата, для которого только один(но не оба) из соответствующих битов операндов равен 1.

PHP
Цитата
Устанавливаются только те биты, которые установлены либо только в $a, либо только в $b


помоему для разного предназначены....

Спустя 2 минуты, 12 секунд (6.12.2011 - 22:16) Winston написал(а):
Может собака зарыта в особенности JS-кой реализации ord ?

Спустя 6 секунд (6.12.2011 - 22:16) vital написал(а):
Цитата (Игорь_Vasinsky @ 6.12.2011 - 21:14)
может в 'крышке' дело?

JS
Цитата
Ставит 1 для каждого бита результата, для которого только один(но не оба) из соответствующих битов операндов равен 1.

PHP
Цитата
Устанавливаются только те биты, которые установлены либо только в $a, либо только в $b


помоему для разного предназначены....

"Крышка" называется XOR или "исключающее или", делает одно и тоже. Даже в твоих цитатах написано одно и то же)

Спустя 1 минута, 5 секунд (6.12.2011 - 22:17) Winston написал(а):
Цитата (Игорь_Vasinsky @ 6.12.2011 - 21:14)
PHP
Цитата
Устанавливаются только те биты, которые установлены либо только в $a, либо только в $b

Походу ты это путаешь с по-бытовым ИЛИ |

Спустя 1 минута, 23 секунды (6.12.2011 - 22:19) vital написал(а):
Цитата (Winston @ 6.12.2011 - 21:16)
Может собака зарыта в особенности JS-кой реализации ord ?

В Js нету функции ord изначально. Есть string.charCodeAt(). Они работают чуть по разному, потому и написана руками своя обертка ord На js, и я указал в комментарии что она возвращает все верно заведомо. Т.е обе ф-и орд возвращают верыне данные - одинаково.

Спустя 7 минут, 26 секунд (6.12.2011 - 22:26) Игорь_Vasinsky написал(а):
Цитата
Походу ты это путаешь с по-бытовым ИЛИ |

да я прям с мануалов цытаты вывел.

Цитата
"Крышка" называется XOR


XOR называется в народе "Крышка"

да.. вообщето одно и тоже.

может в js с типами что нить...


Спустя 1 час, 5 минут, 6 секунд (6.12.2011 - 23:31) Invis1ble написал(а):
результат будет разным из-за различного механизма неявного преобразования типов при выполнении побитового xor

Спустя 10 минут, 45 секунд (6.12.2011 - 23:42) Игорь_Vasinsky написал(а):
и?

Спустя 4 минуты, 47 секунд (6.12.2011 - 23:47) Invis1ble написал(а):
vital
vital, я прав? или мимо?

Спустя 2 минуты, 52 секунды (6.12.2011 - 23:50) vital написал(а):
Цитата (Игорь_Vasinsky @ 6.12.2011 - 22:42)
и?

Ну он прав, да. Но цимес то не раскрыл)
Суть в том, что если сделать str[i] в пхп - то пхп эту отдельную буковку возьмет как char в С => приведет к числу и ксор выполнится как надо.

В js же str[i] = тоже строка.
А если строку привести к числу, то всегда будет ноль т.е string=0(т.е. false) (кстати, емнип, в пхп будет 1(т.е. true, если строка не пуста и 0 если пуста)).
Вот и поулчается, что джс видит 2 строки, к-е ксорят как числа, делает их нулями, 0^0=0..

Кто скажет как поправить?)
Вобщем, тема в назидание - помните и не допускайте таких ошибок, ибо эту фигню дико сложно отловить и дебажить(

Спустя 7 минут, 15 секунд (6.12.2011 - 23:57) Invis1ble написал(а):
vital
Цитата
Суть в том, что если сделать str[i] в пхп - то пхп эту отдельную буковку возьмет как char в С => приведет к числу и ксор выполнится как надо.

неа, щас проверил
echo gettype('s'^'s'); // string

Цитата
Кто скажет как поправить?)

а что нужно получить вообще? т.е. назначение этих плясок какое?

ПС. Ладно, пошел я спать. Тема действительно полезная - подводные камни такие подводные :)

Спустя 4 минуты, 5 секунд (7.12.2011 - 00:01) Игорь_Vasinsky написал(а):
явное приведение к типу

var3 = ord(string(var1[i])^string(var2[i]));

Спустя 2 минуты, 43 секунды (7.12.2011 - 00:04) vital написал(а):
Цитата
а что нужно получить вообще? т.е. назначение этих плясок какое?

Ну вообще там идет алгоритм сравнения картинок, и надо побитово сравнить нечто вроде хеша
Цитата

echo gettype('s'^'s'); // string

Ну по другому быть не может. Тип то строка, мы же его не меняли, мы изменили битово значение.

Суть примера в том - как воспринялось оно в ксоре - как строка из буквы(=0), или как битовое значение этой буквы.

Спустя 4 минуты, 39 секунд (7.12.2011 - 00:08) vital написал(а):
Цитата (Игорь_Vasinsky @ 6.12.2011 - 23:01)
явное приведение к типу

var3 = ord(string(var1[i])^string(var2[i]));

Нажми F12 и попробуй выполнить этот пример ;) это раз.Низя так делать в js. Нету в нем явного приведения к типу.. Во всяком случае таким путем. Второе - это же не решает проблему, если строку привести к строке. Я же выше писал(
Ну вобщем, конкретно в этом случае
var3 = ord(var1[i])^ord(var2[i]);


_____________
"Нужно быть готовым прислушиваться к тем, кто может тебя чему-нибудь научить. Иначе ты никогда не вырастешь."

Откровенно я никому ниразу не нагрубил. А дать подзатыльник зарвавшемуся юнцу, так это и ему на пользу, и мне в удовольствие. © AllesKlar
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.