将c#转换为php

本文关键字:php 转换 | 更新日期: 2023-09-27 18:02:50

我正试图将这个函数从c#转换为php,但是当php只处理整数时,我如何处理需要类型转换为字节数据类型(高达0xFF) ?

public static byte[] CreateKeyBlock()
{
    byte[] ac = new byte[6];
    for (int j = 0; j < 6; j++)
    {
        ac[j] = (byte)Rand.Next(0, 255);
        int i;
        byte d;
        ac[3] = (byte)(ac[1] ^ ac[2] ^ ac[4]);
        ac[0] = (byte)((ac[4] ^ ac[1]) + ac[2]);
        ac[5] = 0;
        d = (byte)0xd5;
        for (i = 0; i < 102; i++)
        {
            if (i % 5 != 0)
            {
                ac[(i % 6)] = (byte)(ac[(i % 6)] + d);
                d = ac[(i % 6)];
            }
            else
            {
                ac[(i % 6)] = (byte)(ac[(i % 6)] ^ d);
                d = ac[(i % 6)];
            }
        }
    }
    return ac;
}

将c#转换为php

function CreateKeyBlock()
{
    $ac = '';
    for ($j = 0; $j < 6; $j++)
    {
        $ac{$j} = rand(0, 255);
        $ac{3} = ($ac{1} ^ $ac{2} ^ $ac{4}) & 0xff;
        $ac{0} = (($ac{4} ^ $ac{1}) + $ac{2}) & 0xff;
        $ac{5} = 0;
        $d = 0xd5;
        for ($i = 0; $i < 102; $i++)
        {
            if ($i % 5 != 0)
            {
                $ac{($i % 6)} = ($ac{($i % 6)} + $d) & 0xff;
                $d = $ac{($i % 6)};
            }
            else
            {
                $ac{($i % 6)} = ($ac{($i % 6)} ^ $d) & 0xff;
                $d = $ac{($i % 6)};
            }
        }
    }
    return $ac;
}

您不需要强制转换任何内容。只要确保任何可能导致值大于255的操作都将其结果限制在字节范围内,例如使用$value & 0xff而不是$value

以什么形式返回结果也是值得考虑的——PHP不是c#,所以字符串在这里可能更有意义。

试试下面的代码:

function CheckByte( $value ) {
    return $value & 0xff;
}
function CreateKeyBlock() {
    $ac = array(0, 0, 0, 0, 0, 0);
    for ( $j = 0; $j < 6; $j++ ) {
        $ac[$j] = rand( 0, 255 );
        $ac[3] = CheckByte( $ac[1] ^ $ac[2] ^ $ac[4] );
        $ac[0] = CheckByte( ( $ac[4] ^ $ac[1] ) + $ac[2] );
        $ac[5] = 0;
        $d = hexdec( "0xd5" );
        for ( $i = 0; $i < 102; $i++ ) {
            $ac[$i % 6] = CheckByte( $i % 5 != 0 ? $ac[$i % 6] + $d : $ac[$i % 6] ^ $d );
            $d = $ac[$i % 6];
        }
    }
    return $ac;
}