如何在PHP中将字节数组转换为字符串?

29

我有一个字节数组,想将其映射到对应的ASCII码。

我应该怎么做?


2
我们能看到一些代码吗?你已经尝试了什么? - Johann du Toit
3
您所说的"convert"是指将ASCII值转换为它们对应的字符吗? - Fredrik
1
你有什么问题吗?它与你之前的问题有关吗?https://dev59.com/XFXTa4cB1Zd3GeqP361B - fabrik
1
我以为这是 https://dev59.com/i3NA5IYBdhLWcg3wn_fD 的重复,但它不是,抱歉(无法删除帖子)。 - fsonmezay
5个回答

88

如果您所说的“字节数组”是指:

$bytes = array(255, 0, 55, 42, 17,    );

array_map()

那么它就像这样简单:

$string = implode(array_map("chr", $bytes));

foreach()

这是以下代码的简化版:

$string = "";
foreach ($bytes as $chr) {
    $string .= chr($chr);
}
// Might be a bit speedier due to not constructing a temporary array.

pack()

然而,最可取的替代方案可能是使用pack("C*", [$array...]),尽管它需要在PHP中使用一些奇特的数组解决方法来传递整数列表:

$str = call_user_func_array("pack", array_merge(array("C*"), $bytes)));

如果你需要从字节C*(用于ASCII字符串)切换到单词S*(用于UCS2)甚至是32位整数列表L*(例如UCS4 Unicode字符串),那么这种构造也更有用。


@alex:我对于徽章追逐这件事情还好,但是这种策略不应该被允许。为了迎合搜索引擎而修改标题,同时改善一个糟糕且简单的问题是一回事,但是悬赏?说真的... - Alix Axel
@Alix,该网站的目标之一不是为搜索引擎提供良好的结果,以击败Experts Exchange、W3 Schools等吗?那么赏金有什么不好呢?我一直想在别人的问题上放置一个赏金,我认为这是一个很好的机会。问题本身并不那么糟糕,显然OP可以为自己做出一些努力,但它仍然是一个不错的问题。你对这个最近的赏金有同样的反对意见吗? - alex
@alex:我对你的编辑没有意见(只是你公开宣传了你这样做是为了刷排名),但悬赏的目的是吸引人们关注那些还没有被接受的问题。在这种情况下,这个问题很糟糕而且很主观,解决方案已经在两个月前以完美的一行代码的形式出现了。你甚至没有颁发奖金只反映出了你真正的(SEO)目的。如果你这样做,至少试着不要那么明显——我最不想看到的就是复制猫使用 SO 的工具进行错误用途。 - Alix Axel
1
@Alix Axel。几周前,当有人在获得已接受答案后自己提供赏金时(假装是一个相当愚蠢的观点帖子),我感到有点冒犯。但情况在这里并不完全一样。虽然问题已经得到了可行的答案,但还有一些其他选择。有些有趣的回答仍然可能出现 - 其中两个是我不敢在SO上提到的。-- 我也不确定是否会有人费心,但如果有更有趣的东西出现,我相信@alex会把关注奖励(这就是赏金系统应该做的全部)放在更有趣的地方。 - mario
1
'call_user_func_array()' 应该被使用参数展开的 '...' 取代,参考:http://php.net/manual/zh/migration56.new-features.php所以代码应该是 pack('C*',...$bytes)。 - Eaton Emmerich
显示剩余4条评论

11

针对使用pack()的回答,根据mario的建议进行修正: 自PHP 5.5以来,您可以通过...使用参数解包。

$str = pack('C*', ...$bytes);

其他函数可以使用,但最好编写可读性强的代码。


1
如果您提供了与问题相关的可用示例,那将是很好的。 - David
1
这是执行速度最快的解决方案。 - Paolo

2
另一种方法:
$str = vsprintf(str_repeat('%c', count($bytes)), $bytes);

万岁!


1

Mario已经提供了最佳选择{{link2:,但这里有一种更具异域风情的实现方式。

$str = call_user_func_array(
        'sprintf',
        array_merge((array) str_repeat('%c', count($bytes)), $bytes)
       );

CodePad


0
以下是将Yodlee MFA ByteArray转换为CAPTCHA图像的示例。希望能对某些人有所帮助...
您只需要将字节数组转换为字符串,然后编码为base64即可。
以下是PHP示例:
$byteArray = $obj_response->fieldInfo->image; //Here you get the image from the API getMFAResponse

$string = implode(array_map("chr", $byteArray)); //Convert it to string

$base64 = base64_encode($string); //Encode to base64

$img = "<img src= 'data:image/jpeg;base64, $base64' />"; //Create the image

print($img); //Display the image

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