【问题标题】:base64_decode omits one bytebase64_decode 省略一个字节
【发布时间】:2012-07-19 14:36:23
【问题描述】:

我在这个字符串上使用 PHP 的 base64_decode

Dg+to8RaC3VzAGRThP7iiXe0f5bgp7xmcQoqaAJxggs=

它应该返回 32 字节的数据。 但不知何故,我最终得到了一个只有 31 个字节长的字符串。

这就是我正在做的:

$data = base64_decode($data);
if($data == FALSE)
{
    die("decode faild");
}

问题在于解码实际上会起作用。但它只返回 31 个字节。 当我这样做时:$len = strlen($data); 那么$len 将包含 31 个字符而不是 32 个。

使用以下字符串(奇怪):

az8XFgxw/ODAr3EDElvgab/axINKVMDCrw5u51gn6bo=

在解码之前我已经在base64urldecode 之后尝试了urlencode,但结果完全一样(它有效但省略了一个字节)

我错过了什么?


编辑:我打印出所有字节。它真的省略了最后一个字节! 0x0B(最后一个字节)丢失,但其他字节在那里。

编辑 2: 额外的测试产生: 1.当我将base64字符串直接嵌入到PHP文件中时,它总是有效的。 2. 当我从$_GET 变量中获取base64 字符串时,有时它不起作用。

$_GET 坏了吗?

【问题讨论】:

  • 好像是32 bytes for me
  • 如果您在base64_encode 之前使用不可打印字符,您完全需要对$_GET 参数进行urlencode。
  • 好的,谢谢。 @nickb:是的,它是 32 字节,但在我的 PHP 脚本中,它返回了一个 31 字节长的字符串。 Ah 和 urldecode 不应该使用,因为脚本会以某种方式自动解码该值。 (再次应用 urldecode 会以某种方式再次触发错误)

标签: php base64 byte


【解决方案1】:

我的朋友是+,它被解释为(空格)。所以要么url_encode()在将数据附加到URL之前,然后在你的脚本中url_decode(),或者简单地用+替换空格。

$data = base64_decode(str_replace(' ', '+', $data));

【讨论】:

  • 您建议的两种解决方案都有效。谢谢。我现在正在使用 urlencode。但不知何故,甚至不需要 urldecode 。其实在php-script中使用urldecode会再次触发错误!!也许获取变量会自动取消编码值???
猜你喜欢
  • 1970-01-01
  • 2014-07-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-16
  • 1970-01-01
相关资源
最近更新 更多