我知道这是一个非常愚蠢的问题,但我不知道该怎么做。
我有一个任意的二进制数,比如说,
1001000000110010000000100100000010000011000000010001000001011000110000110000011100011100000011000000010010011000100000000000000100100000010110001100001000000111
Run Code Online (Sandbox Code Playgroud)
我想使用 PHP 将其转换为 Base 64 - 我尝试的每一种方式都会给我不同的结果。即使是不同的在线转换器也会对其进行不同的转换:
http://home2.paulshou.net/tools/xlate/
http://convertxy.com/index.php/numberbases/
PHP 的 base_convert 仅适用于 base36,而 base64_encode 需要一个字符串。
我该怎么办?
更新:我实现了@binaryLV建议的解决方案功能,并且效果很好。
但是,我将结果与 PHP 的内置base_convert 进行了比较。事实证明,base_convert 到 base36 返回的值比自定义 base64 函数更短!(是的,我确实在所有二进制数前面加上了一个“1”,以确保前导零不会丢失)。
我也注意到,base_convert在处理大数字时非常不准确。所以我需要一个像 base_convert 一样工作的函数,但准确,最好是 base 64。
示例中字符串的长度是 160。这让我觉得它包含大约 160/8 个字符的信息。所以,
这将适用于 size 的字符串n*8。对于其他字符串(例如,12 个二进制数字),它会给出意想不到的结果。
代码:
function bin2base64($bin) {
$arr = str_split($bin, 8);
$str = '';
foreach ( $arr as $binNumber ) {
$str .= chr(bindec($binNumber));
}
return base64_encode($str);
}
$bin = '1001000000110010000000100100000010000011000000010001000001011000110000110000011100011100000011000000010010011000100000000000000100100000010110001100001000000111';
echo bin2base64($bin);
Run Code Online (Sandbox Code Playgroud)
结果:
kDICQIMBEFjDBxwMBJiAASBYwgc=
Run Code Online (Sandbox Code Playgroud)
这也是将其解码回二进制数字串的函数:
function base64bin($str) {
$result = '';
$str = base64_decode($str);
$len = strlen($str);
for ( $n = 0; $n < $len; $n++ ) {
$result .= str_pad(decbin(ord($str[$n])), 8, '0', STR_PAD_LEFT);
}
return $result;
}
var_dump(base64bin(bin2base64($bin)) === $bin);
Run Code Online (Sandbox Code Playgroud)
结果:
boolean true
Run Code Online (Sandbox Code Playgroud)