base64_encode()的差异

时间:2013-05-21 19:25:05

标签: php windows active-directory

我正在尝试编写一个PHP脚本,该脚本接收csv文件,然后创建一个LDIFDE文件,用于将学生导入AD。

我有一切工作但密码。

问题似乎与PHP中的base64_encode()有关。

echo $password = '"Password1"';
echo "<br />";
echo $testPass = base64_decode("IgBQAGEAcwBzAHcAbwByAGQAMQAiAA==");
echo "<br />";
echo base64_encode($password);
echo "<br />";
echo "IgBQAGEAcwBzAHcAbwByAGQAMQAiAA==";
echo "<br />";
echo base64_encode($testPass);

输出结果为:

"Password1"
"Password1"
IlBhc3N3b3JkMSI=
IgBQAGEAcwBzAHcAbwByAGQAMQAiAA==
IgBQAGEAcwBzAHcAbwByAGQAMQAiAA==

我找不到“Password1”之间的区别。有谁知道我在这里做错了什么?一旦我可以获得我的初始和编码的$密码以匹配编码的$ testPass,我应该能够正常工作。

1 个答案:

答案 0 :(得分:3)

我将把你的两个base64编码的字符串称为“短字符串”和“长字符串”。

长字符串似乎是编码为UTF16 Little Endian(或UCS-2LE)的短字符串。看看这个长字符串解码的hexdump:

          00 01 02 03 04 05 06 07 - 08 09 0A 0B 0C 0D 0E 0F  0123456789ABCDEF

00000000  22 00 50 00 61 00 73 00 - 73 00 77 00 6F 00 72 00  ".P.a.s.s.w.o.r.
00000010  64 00 31 00 22 00                                  d.1.".

如您所见,每个有效的ASCII字节后面都有一个空字节,这是您的差异所在。问题是,你想要长串还是短串?无论哪种方式,请查看PHP手册中的mb_convert_encoding()以获取您的目的地。

长字符串的编码是“UCS-2LE”;短字符串的编码类似于“ISO-8859-1”或“cp1252”。根据你想要产生的参数,将它们放在“from”和“to”参数中。

编辑 - 必需的电话

我在评论中发布了这个,但为了便于参考,我将其包含在此处。要获取长字符串,请使用'UCS-2LE'作为第二个参数调用mb_convert_encoding()。例如:

$password = '"Password1"';
echo base64_encode(mb_convert_encoding($password, 'UCS-2LE'));

产地:

IgBQAGEAcwBzAHcAbwByAGQAMQAiAA==