За последние 24 часа нас посетили 36910 программистов и 7901 робот. Сейчас ищут 1717 программистов ...

Помогите с портированием кода

Тема в разделе "PHP для новичков", создана пользователем Cyberbob, 26 сен 2023.

  1. Cyberbob

    Cyberbob Новичок

    С нами с:
    26 сен 2023
    Сообщения:
    2
    Симпатии:
    0
    Портирую код с .NET в PHP

    исходный вариант -
    Код (Text):
    1. using System;
    2. using System.Collections;
    3.  
    4. namespace Test
    5. {
    6.     internal class Program
    7.     {
    8.         unsafe static void p3_hash(byte[] pin, byte[] seed, byte[] hash)
    9.         {
    10.             uint n = 0xc541a9, m = 0x1212050;
    11.             ulong k;
    12.             byte* in_ = (byte*)&k;
    13.  
    14.             in_[0] = seed[0];
    15.             in_[1] = seed[1];
    16.             in_[2] = seed[2];
    17.             in_[3] = pin[0];
    18.             in_[4] = pin[1];
    19.             in_[5] = pin[2];
    20.             in_[6] = pin[3];
    21.             in_[7] = pin[4];
    22.  
    23.             for (int i = 0; i < 64; i++, n >>= 1, k >>= 1)
    24.             {
    25.                 if (((n ^ k) & 0x1) != 0)
    26.                 {
    27.                     n ^= m;
    28.                 }
    29.             }
    30.  
    31.             int[] out_ = new int[8];
    32.             BitArray bits = new BitArray(new int[] { (int)n });
    33.  
    34.             for (int i = 0; i < 7; i++)
    35.             {
    36.                 for (int j = 0; j < 4; j++)
    37.                 {
    38.                     if (bits[4 * i + j])
    39.                     {
    40.                         out_[i] |= 1 << j;
    41.                     }
    42.                 }
    43.             }
    44.  
    45.             hash[0] = (byte)(0x10 * out_[2] + out_[1]);
    46.             hash[1] = (byte)(0x10 * out_[3] + out_[5]);
    47.             hash[2] = (byte)(0x10 * out_[0] + out_[4]);
    48.         }
    49.  
    50.         unsafe static void Main(string[] args)
    51.         {
    52.             byte[] seed = { 0x07, 0x35, 0xC3 };
    53.             byte[] key = new byte[3];
    54.             byte[] pin = { 0x03, 0x18, 0x40, 0x21, 0x7B };
    55.  
    56.             p3_hash(pin, seed, key);
    57.  
    58.             Console.WriteLine($"SEED: {seed[0].ToString("X2")}  {seed[1].ToString("X2")} {seed[2].ToString("X2")}, KEY: {key[0].ToString("X2")} {key[1].ToString("X2")} {key[2].ToString("X2")}");
    59.         }
    60.     }
    61. }
    Что выходит у меня -
    Код (PHP):
    1. <?php
    2. function p3_hash($pin, $seed, &$key)
    3. {
    4.     $n = 0xc541a9;
    5.     $m = 0x1212050;
    6.     $k = 0;
    7.     $in_ = unpack('C*', pack('J', $k));
    8.  
    9.     $in_[1] = $seed[0];
    10.     $in_[2] = $seed[1];
    11.     $in_[3] = $seed[2];
    12.     $in_[4] = $pin[0];
    13.     $in_[5] = $pin[1];
    14.     $in_[6] = $pin[2];
    15.     $in_[7] = $pin[3];
    16.     $in_[8] = $pin[4];
    17.  
    18.     for ($i = 0; $i < 64; $i++, $n >>= 1, $k >>= 1) {
    19.         if ((($n ^ $k) & 0x1) != 0) {
    20.             $n ^= $m;
    21.         }
    22.     }
    23.  
    24.     $out_ = [0, 0, 0, 0, 0, 0, 0, 0];
    25.  
    26.     for ($i = 0; $i < 7; $i++) {
    27.         for ($j = 0; $j < 4; $j++) {
    28.             if (($n & 1) != 0) {
    29.                 $out_[$i] |= 1 << $j;
    30.             }
    31.             $n >>= 1;
    32.         }
    33.     }
    34.  
    35.     $key[0] = (0x10 * $out_[2] + $out_[1]) & 0xFF;
    36.     $key[1] = (0x10 * $out_[3] + $out_[5]) & 0xFF;
    37.     $key[2] = (0x10 * $out_[0] + $out_[4]) & 0xFF;
    38. }
    39.  
    40. $seed = [0x07, 0x35, 0xC3];
    41. $key = [0, 0, 0];
    42. $pin = [0x03, 0x18, 0x40, 0x21, 0x7B];
    43.  
    44. p3_hash($pin, $seed, $key);
    45.  
    46. echo "SEED: " . sprintf("%02X", $seed[0]) . " " . sprintf("%02X", $seed[1]) . " " . sprintf("%02X", $seed[2]) . ", KEY: " . sprintf("%02X", $key[0]) . " " . sprintf("%02X", $key[1]) . " " . sprintf("%02X", $key[2]);
    47. ?>
    Вывод исходного - SEED: 07 35 C3, KEY: 10 E7 94
    Вывод на PHP - SEED: 07 35 C3, KEY: 29 3F 78

    Что я делаю не так? Как исправить?