我将脚本从Perl移植到PHP,我有错误。以下代码为相同的输入数据返回不同的结果。而字符串返回Perl的时间比PHP中的行长2倍,但此行的开头与PHP行重合。 我希望它编码输入行,但直到最后才弄清楚。
//C
typedef struct SomeStruct
{
float matrix[7][12];
} SomeStruct;
//C#
public struct SomeStruct
{
[MarshalAs(UnmanagedType.ByValArray, SizeConst = ???)]
public float[][] matrix;
}
请帮助我在PHP中获得与Perl相同的$test = $password ^ $newchal;
值?
答案 0 :(得分:4)
语言的定义行为似乎不同。
如果二进制按位运算的操作数是不同大小的字符串, |和^ ops就好像较短的操作数有额外的零位 在右边
PHP documentation似乎没有定义在这种情况下会发生什么,但其中一个示例将其解决了:
echo "12" ^ "9"; // Outputs the Backspace character (ascii 8)
// ('1' (ascii 49)) ^ ('9' (ascii 57)) = #8
所以看来在PHP中,较长字符串中的额外字符将被丢弃,而在Perl中它们将被包含在内。
<强>更新强>
要在PHP中获得所需的行为,有几个选项。您可以在字符串的末尾添加空字符。
$password = ' ';
$newchal = "abcdefghijklmnop";
#prints ABCDEFGH
echo $password ^ $newchal;
$password .= "\0\0\0\0\0\0\0\0";
#prints ABCDEFGHijklmnop
echo $password ^ $newchal;
此示例假定字符串始终是固定的已知长度。如果需要处理任意情况,可以测量每个字符串的长度,然后根据需要添加空字符。当然,如果您不想改变原始变量,请在执行上述操作之前将其置于临时变量中。