0

无论如何要确保base64编码的字符串永远不会包含非字母数字字符?

例如,如果我有一个要编码的长字符串,是否可以在其前面添加或附加一些内容,以确保使用 base64 编码时,编码字符串中只包含字母和数字?像这样的东西:

细绳:192.168.1.1

编码:MTkyLjE2OC4xLjE=<-我想“摆脱”等号。

我尝试在字符串末尾追加}(新字符串现在192.168.1.1}),这有效(新编码字符串:)MTkyLjE2OC4xLjF9,但是有没有一种方法可以确保每个组合都有效?

这可能吗?

4

2 回答 2

1

是关于长度的。= 符号是填充以使输出成为 4 个 base64 字符的倍数。3 个字符转换为 4 个 base64 字符,因此您只需以某种方式使输入字符串的长度为 3 个字符的倍数。在你的情况下:

192.168.1.1 - 11 characters long, base64 ends with =
192.168.1.1$ - 12 characters long, base64 doesn't end with =

选择一个可以轻松删除的填充字符。

另一种选择是从输出中删除 =,然后确保在尝试 base64 解码之前附加 = 符号以生成 4 个字符的倍数...

于 2012-05-20T12:26:31.733 回答
1

您可以将等号 rtrim() 去掉,这是大多数人所做的。

但至于你的问题:当字符串/ 3 的长度是一个整数时。所以:

$pad = strlen($str) % 3; if($pad) { $str .= str_repeat(' ', $pad); }

但是,是的,当您将字符串传回时,解析器会像这样自动将等号添加回 4 的倍数 - 所以您不需要保留它们。

于 2012-05-20T12:31:49.613 回答