Конвертировать массив php и хеш-функцию sha1 в c # - PullRequest
0 голосов
/ 08 августа 2011

Поскольку поставщик услуг дал мне следующий php-код, который мне нужно скопировать в C #

$aData = array('merchant_id'      => 'your merchant ID',  // 123456
               'project_id'       => 'your project ID', // 242342
               'amount'           => 'amount',    // 199 = 1,99 EUR
               'currency_code'    => 'currency code',       // EUR
               'purpose_1'        => 'subject line1',
               'merchant_key'     => 'your merchant key');  //34g1asda4524tgw
$sHash = sha1(implode('|', $aData));

Поскольку у меня есть только базовые знания php, я был бы очень рад, если бы кто-то мог помочь мне преобразоватьэто в C #.

Моей первой мыслью было создание словаря, но труба в функции взлома меня немного беспокоит.Итак, какой массив / список я должен использовать?

Тогда как бы я "взорвал" список?

РЕШЕНИЕ

Спасибо @andreas и @Mchl!Следующий код возвращает хэш 65f23ce1507167668691445bd35451e4c6b0572b.

        //test
        string merchantId = "your merchant ID";
        string projectId = "your project ID";
        string amount = "amount";
        string currency = "currency code";
        string invoiceId = "subject line1";
        string merchantKey = "your merchant key";

        string imploded = merchantId + "|" + projectId + "|" + amount + "|" + currency + "|" + invoiceId + "|"+merchantKey;
        byte[] arrayData = Encoding.ASCII.GetBytes(imploded);
        byte[] hash = SHA1.ComputeHash(arrayData);
        //return hash.ToString();
        string result = null;
        string temp = null;

        for (int i = 0; i < hash.Length; i++)
        {
            temp = Convert.ToString(hash[i], 16);
            if (temp.Length == 1)
                temp = "0" + temp;
            result += temp;
        }

Ответы [ 2 ]

2 голосов
/ 08 августа 2011

Это в основном вызов метода sha1 для значений объединенных массивов |разделены:

sha1("123456|242342|199|EUR|subject1|34g1asda4524tgw");

Я не эксперт по C #, но я думаю, что сделать это в C # тривиально:)


Вот некоторые ссылкиРезультаты для вас:

>> $aData = array('merchant_id'      => 'your merchant ID',  // 123456
..                'project_id'       => 'your project ID', // 242342
..                'amount'           => 'amount',    // 199 = 1,99 EUR
..                'currency_code'    => 'currency code',       // EUR
..                'purpose_1'        => 'subject line1',
..                'merchant_key'     => 'your merchant key');  //34g1asda4524tgw

>> $aData;
array (
  'merchant_id' => 'your merchant ID',
  'project_id' => 'your project ID',
  'amount' => 'amount',
  'currency_code' => 'currency code',
  'purpose_1' => 'subject line1',
  'merchant_key' => 'your merchant key',
)

>> implode('|',$aData);
'your merchant ID|your project ID|amount|currency code|subject line1|your merchant key'

>> sha1(implode('|',$aData));
'65f23ce1507167668691445bd35451e4c6b0572b'
0 голосов
/ 08 августа 2011

Для взрыва требуется некая форма упорядоченного списка.Таким образом, Dictionary<K,V> не является правильным выбором.Я бы пошел с List<KeyValuePair<string,string>.

Вам нужно добавить пары в том же порядке, как их перечисляет php.Понятия не имею, является ли это порядком сложения или неопределенным, ...

Следующая проблема заключается в том, как php обрабатывает пары ключ-значение в этом контексте.В документации для implode этого не сказано.Мой пример просто использует значение в паре.

string joinedString=string.Join("|", list.Value);

Далее вам нужно преобразовать строку в байтовый массив.Для этого вам нужно выбрать кодировку, которая соответствует кодировке php, но не знаю, что это такое.Например, с UTF-8:

string joinedBytes=Utf8Encoding.GetBytes(joinedString);
...