我正在尝试将此函数从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;
}
答案 0 :(得分:1)
你不需要施放任何东西。只需确保任何可能导致值超过255的操作都将其结果钳制到字节范围,例如使用$value & 0xff
代替$value
。
同样值得考虑以什么形式返回结果 - PHP不是C#,所以字符串在这里可能更有意义。
答案 1 :(得分:1)
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;
}
答案 2 :(得分:0)
试试这段代码:
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;
}