Я нашел этот фрагмент кода онлайн, и мне было интересно, что он делает:
$k[$i] = ord($key{$i}) & 0x1F;
Я знаю, что ord()
возвращает значение ASCII, но я не понимаю, что фигурные скобки делают $key{$i}
, а также то, что это делает & 0x1F
.
Я нашел этот фрагмент кода онлайн, и мне было интересно, что он делает:
$k[$i] = ord($key{$i}) & 0x1F;
Я знаю, что ord()
возвращает значение ASCII, но я не понимаю, что фигурные скобки делают $key{$i}
, а также то, что это делает & 0x1F
.
Это не синтаксис массива. Он предназначен для доступа к одиночным символам только из строк. Индекс должен быть числовым.
$str{1} == $str[1]
Он кратко упоминается здесь в информационном окне: http://www.php.net/manual/en/language.types.string.php#language.types.string.substr
Кроме того, он официально объявлен устаревшим. Он был включен и отключен, предположительно, в руководстве, но по-прежнему очень важен, если необычный синтаксис.
& 0x1F
- бит-бит И. В этом случае он ограничивает десятичные значения от 0 до 31.
Первая часть вашего вопроса: фигурные скобки
Это касается ссылки на значение переменной.
В вашем примере, если $i
равно 123
, тогда
$k[$i] = ord($key{$i}) & 0x1F;
будет таким же, как
$k[123] = ord($key[123]) & 0x1F;
Вторая часть вашего вопроса: '&' знак
&
является двоичным оператором. Подробнее в документации. Он устанавливает биты, если они установлены в обеих переменных.
В PHP либо [квадратные скобки], либо {фигурные скобки} являются полностью законными, взаимозаменяемыми средствами доступа к массиву:
Примечание. Оба квадратных скобки и фигурные скобки могут использоваться взаимозаменяемо для доступа к элементам массива (например, $array [42] и $array {42} будут делать то же самое в примере выше).
Источник: http://www.php.net/manual/en/language.types.array.php
Оба являются полностью действительными; фигурные скобки не устарели.
Относительно "& 0x1F" другие, такие как @Tadek, ответили:
& является бинарным оператором. Подробнее см. В документации [http://www.php.net/manual/en/language.operators.bitwise.php]. Он устанавливает биты, если они установлены в обеих переменных.
& 0x1F
- это побитовая операция, используемая для "нормализации" значений символов, цветов и т.д., которые помещаются в шестнадцатеричные, но не обязательно "читаются" одинаково. Подробнее о Wikipedia здесь.
& 0x1f
эквивалентно
& 00011111
Это может эффективно установить первые три бита любого значения размера байта в 0.
0xff & 0x1f
приводит к
0x1f
или
11111111 & 00011111
приводит к
00011111