最近在看《大規模WEB服務開發技術》這本書中。書中提到“可變長位元組碼演算法”的壓縮資料的演算法,以達到壓縮資料,減少磁碟IO。
可變長位元組碼演算法:
任意一個位元組的最高位(下標7)均只作為標誌位,而且根據位元組所在位置需要乘以128的相應冪次;
這是他的虛擬碼
仔細研究後,我翻譯成PHP版的:
($n){ $bytes = []; while (true){ array_unshift($bytes, bcmod($n, 128)); if($n < 128){ break; }else{ $n = intval($n/128); } } $bytes[count($bytes) - 1] += 128; return $bytes; } function encode($numbers){ $bytestream = []; foreach ($numbers as $n){ $bytestream = array_merge($bytestream, codeNumber($n)); } return $bytestream; } function decode($bytestream){ $numbers = []; $n = 0; for ($i = 0; $i < count($bytestream); $i++){ if($bytestream[$i] < 128){ $n = 128 * $n + $bytestream[$i]; }else{ $n = 128 * $n + ($bytestream[$i] - 128); array_push($numbers, $n); $n = 0; } } return $numbers; } $a = encode([5, 130, 288]); var_dump($a); var_dump(decode($a));列印出來的內容是:array(5) { [0]=> int(133) [1]=> string(1)"1" [2]=> int(130) [3]=> string(1)"2" [4]=> int(160) }array(3) { [0]=> int(5) [1]=> int(130) [2]=> int(288) } //寫二進位 $h = fopen('ejz3.txt', 'wb'); foreach ($a as $k => $v) { $str3 = pack('H*', sprintf("%02x", $v)); fwrite($h, $str3); } fclose($h); //讀二進位 $str2 = file_get_contents('ejz3.txt'); $str2 = unpack("H*", $str2); $value = str_split($str2[1], 2); foreach ($value as $k => $v) { $value[$k] = base_convert($v, 16, 10); }
').addClass('pre-numbering').hide(); $(this).addClass('has-numbering').parent().append($numbering); for (i = 1; i <= lines; i++) { $numbering.append($('
').text(i)); }; $numbering.fadeIn(1700); }); });
以上就介紹了可變長位元組碼演算法,包括了方面的內容,希望對PHP教程有興趣的朋友有所協助。