PHP自定义字母表的base64编码

7

我尝试使用base64_encode()和base64_decode()函数,但使用自定义字母表。默认字母表如下:

"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"

假设我想要使用:

"ZYXWVUTSRQPONMLKJIHGFEDCBAzyxwvutsrqponmlkjihgfedcba9876543210+/" 

我在互联网上找到了一个类,但是它的效果与预期不符。有什么简单的方法可以实现这个功能吗?


看一下这个类 - 它可能有效:http://www.php.net/manual/en/function.base64-encode.php#78765 - h2ooooooo
你尝试过修改你找到的类吗?你能告诉我们它在哪里吗? - SaidbakR
删除了注释,是我的错误。 - Alex Rashkov
是的,h2ooooooo,那是我使用的类。问题是它表现得很奇怪:正常的base64_encode()给我一个字符串"test",例如dGVzdA==,而使用该类(相同的字母表)给我dGVzdAAA,我需要它们完全相同(使用相同的字母表,我可以更改它)。 - bsteo
@xtmtrx,你在自定义字母表中包含了填充字符吗? - John Dvorak
可能是其他100个问题的重复。 - dynamic
2个回答

17

非常简单,strtr可以轻松实现此功能:

$default = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
$custom  = "ZYXWVUTSRQPONMLKJIHGFEDCBAzyxwvutsrqponmlkjihgfedcba9876543210+/";

$encoded = strtr(base64_encode($input), $default, $custom);

考虑过这个,但我不确定它是否能够产生有效的base64输出? - bsteo
@xtmtrx:我不确定你在这里的意图是什么。如果你想要有效的base64编码,请不要触碰base64_encode的输出。 - Jon
使用上面的“ZYXWVUTSRQPONMLKJIHGFEDCBAzyxwvutsrqponmlkjihgfedcba9876543210 + /”编码字符串应该给我“wTEawZ ==”,但在h2ooooooo的示例中,使用的类会给我“wTEawZZZ”。 - bsteo
4
我希望您没有将这个用作“加密”工具。 - Jon

2

除了上述定义的自定义编码外,如果要使用自定义字母表进行解码,可以按照以下步骤操作:

    $custom = 'ZYXWVUTSRQPONMLKJIHGFEDCBAzyxwvutsrqponmlkjihgfedcba9876543210+/';
    $default = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
    $decoded = base64_decode(strtr($input, $custom, $default));

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接