Мы должны внедрить шифрование для внешнего интерфейса. Владелец интерфейса предоставил документацию о том, как подготовить то же шифрование на нашей стороне. Однако эта документация находится на C #, и мы работаем в PHP.
Большинство частей, которые мы понимаем, за исключением тех случаев, когда они, похоже, вызывают хеш для int. Их код гласит:
// hashString exists and is a md5 a like string int[] keyBuffer = new int[hashString.length]; for (int i=0; i<hashString.length; i++) { keyBuffer[i] = (int)hashString[i]; }
В PHP, когда вы отправляете букву как int, вы получаете 0 (int). Поскольку мы не можем себе представить, что это означает третья сторона, мы считаем, что C # делает что-то еще.
Ссылается ли C # на int 0 или, возможно, на char?
Во-вторых, оригинальный hashString имеет длину 320. Это означает, что код будет создавать int, длина которого составляет 320? В PHP у вас нет такой идеи резервирования памяти, как это делает C # здесь. Но когда мы пытаемся приписать 320 длинную строку в int, мы получаем int, который длится 19 'символов.
C # также создает более короткий int при типизации очень длинного «числа» в строке?
Вы конвертируете char
в int
. char
– это код UTF-16 – неподписанное 16-битовое целое число (диапазон [0, 65535]
). Вы получаете это значение, в основном, расширенное до 32-разрядного целого числа со знаком. Так, например, 'A'
достигает 65, а символ евро (U + 20AC) заканчивается как 8364 (0x20ac).
Что касается вашей второй части – вы создаете int
, вы создаете массив int
. Да, вы создадите массив из 320 элементов.
Строки C # – UTF16. Когда вы вводите символ UTF16 в int, он просто копирует 16-битное значение символа UTF16 в 32-битный int.
C # может передать символ в int и даст вам код символа. В приведенном выше коде берётся строка, hashString
и превращается в массив целых чисел, keybuffer
. C # способен обрабатывать строку, подобную массиву символов, используя синтаксис indexer []
. В приведенном выше коде будет создан массив ints, по одному на символ в хэш-строке, и каждый int будет символьным кодом соответствующего символа.
Чтобы развернуть сообщение Джона Скита, ваши «десятичные» целые значения будут сопоставляться с соответствующими значениями char, как в приведенной ниже таблице (которую я уже на протяжении многих лет использовал на своих компьютерах разработки).
Таким образом, приведение integer
значения 0 в char
возвращает NULL
.
РЕДАКТИРОВАТЬ: Если вы посмотрите на свой первоначальный вопрос, возможно, вам лучше будет служить пример MD5 вместо того, чтобы перевести строку в массив целых чисел.
Код фактически передал char
(обычно ASCII) в int
, а не «0» на 0. Поэтому, если исходная строка «d131dd02c5e6eec4», результирующий массив будет int [] {100, 49, 51, 49, 100, 100, 48, 50, 99, 53, 101, 54, 101, 101, 99, 52}.
Поэтому я предполагаю, что вам нужна функция ord
в вашем PHP-скрипте.
РЕДАКТИРОВАТЬ:
Немного замечаний, приведение string
к int
в PHP может фактически отражать ее в int
, а самые большие int
PHP-дескрипторы – либо 32-разрядные, либо 64-разрядные, в зависимости от ОС, поэтому вы получаете длинный 19-символьный int, который – это максимум 64-битного int.
В C # существует другой тип переменной, называемый char
, который представляет один символ Юникода и может быть введен непосредственно в целое число. Вы не можете наложить string
в C # на int
непосредственно на C #.
EDIT2: Я предполагаю, что ваш PHP-скрипт выглядит так:
<?php $keyBuffer = new array(); for ($i=0; $i<strlen($hashString); $i++) { $keyBuffer[$i] = ord($hashString[i]); } ?>