PHP 中的字节操作

2022-08-30 22:06:15

在PHP中,如果你有一个包含二进制数据的变量,你如何从数据中获取特定的字节?例如,如果我有一些长度为 30 字节的数据,如何获取前 8 个字节?

现在,我像一个字符串一样对待它,使用这个函数:substr()

$data = //...
$first8Bytes = substr($data, 0, 8);

substr 与二进制数据一起使用是否安全?

还是我应该使用其他功能?


答案 1

如果安装了 mbstring 扩展并启用了 mbstring 重载,则使用可能会给您带来麻烦。每次调用时都会自动调用 Mbstring 重载(如果安装了 mbstring 并且禁用了 mbstring 重载,则将正确检索字节)。如果安装了 mbstring,则使用下面的代码,如果未安装, 则使用下面的代码。使用“8 位”字符编码,它将每个字符视为 1 个字节,并将忽略空终止符 ('\0')。substrmb_substrsubstrsubstrmb_substrsubstr

if (function_exists('mb_substr')) {
    $bytes = mb_substr($string, 0, 8, '8bit');
} else {
    $bytes = substr($string, 0, 8);
}

感谢 ircmaxell


答案 2

通常,PHP中的所有字符串函数都可以安全地与原始字节一起使用。最常出现的问题是空字节,但仅适用于文件系统函数:http://php.net/manual/en/security.filesystem.nullbytes.php

您的完全可以用于二进制字符串。其他一些函数,如 C 接口,其中“\0”字符成为一个问题。substr()strtokereg


推荐