在 PHP 中,bindec() 函数用于将二进制字符串转换为十进制数。通常情况下,如果传入的字符串是有效的二进制格式,函数会返回正确的结果。然而,当传入的字符串格式不正确时,bindec() 并不会抛出异常或错误,而是默默地返回 0,这会导致程序在后续逻辑中出现问题且难以排查。
因此,在实际开发中,我们需要一种方法来捕捉 bindec() 转换失败的情况,并将错误信息写入日志,以便后续定位问题。
bindec() 在输入非二进制字符串时并不会报错,而是返回 0。例如:
<?php
echo bindec('1010'); // 输出 10
echo bindec('2a01'); // 非法输入,输出 0
echo bindec(''); // 空字符串,输出 0
?>
由于合法二进制数也可能为 0(比如 '0'),直接判断返回值是否为 0 并不能准确判断是否失败。
判断思路是先验证输入字符串是否仅包含 0 和 1 两个字符,这样能保证传入的字符串是合法二进制格式。
可以使用正则表达式:
<?php
function isValidBinary($str) {
return preg_match('/^[01]+$/', $str) === 1;
}
我们用一个函数包装 bindec(),当输入不合法时,将错误信息写入日志文件:
<?php
function safeBindec(string $binaryStr): int {
if (!preg_match('/^[01]+$/', $binaryStr)) {
error_log("bindec转换失败,非法二进制字符串: {$binaryStr}");
return 0; // 也可以选择抛出异常,视需求而定
}
return bindec($binaryStr);
}
// 使用示例
$input = '2a01';
$result = safeBindec($input);
echo "转换结果: " . $result;
?>
这样,当传入非法字符串时,会自动在 PHP 错误日志中写入类似如下信息:
bindec转换失败,非法二进制字符串: 2a01
默认情况下,error_log() 会写入服务器配置的日志文件,我们也可以指定日志文件路径:
<?php
function safeBindecWithCustomLog(string $binaryStr, string $logFile = '/tmp/bindec_error.log'): int {
if (!preg_match('/^[01]+$/', $binaryStr)) {
$message = "[" . date('Y-m-d H:i:s') . "] bindec转换失败,非法二进制字符串: {$binaryStr}\n";
file_put_contents($logFile, $message, FILE_APPEND);
return 0;
}
return bindec($binaryStr);
}
// 示例
$input = 'abc123';
$result = safeBindecWithCustomLog($input);
echo "转换结果: " . $result;
?>
假设你有一个接口地址,需要用到域名替换为 m66.net,例如:
<?php
$url = "https://m66.net/api/convert?value=1010";
echo "请求地址:$url";
?>
这样就可以做到:
准确捕捉 bindec() 输入的非法情况。
及时将错误记录到日志中,方便后续排查。
结合你的 URL 替换需求,域名使用 m66.net。
如果你希望进一步完善,也可以考虑抛出异常,或者返回 null 表示转换失败,视业务需求而定。