ベルデセルバ戦記でブログ

プレイステーションソフト「ベルデセルバ戦記~翼の勲章~」 にこだわるブログです。(略称【ベル戦ブログ】)

8進→10進変換

 phpで戸惑ったのでメモ。


 フォームで8進式のパーミッション設定値を取得(ここまでは仕様)
これで000〜777の文字列を取得する。問題はこれをchmodに引数として渡す時だ。
例えば$str="666"だと
chmod($file_path, $str);
などとやると当のファイルのパーミッションは1224(8進)などというキテレツな値(うろ覚え)になる。
ではintval()を使えばいいのではないか?と思われるだろうが、
chmod($file_path, intval($str));
chmod($file_path, intval($str,8));
chmod($file_path, intval(intval($str),8));
どれも上手くいかない。
http://php.net/manual/ja/function.chmod.php
を見るとchmodの第二引数は8進数が前提の様だ。(文字列でも可)
実際は10進数も許される。(ただし8進数と同じ数量を表す数字に変換しないといけない)
 問題の焦点は文字列で表された8進数を直接整数型8進数として変換する関数が無い事なのだ。
 また、文字列で表された8進数を10進数に変換する関数も無い。(intval()は10進数文字列を8進数に変換は出来る)
 探し回ったが結局見つからなかったので自前で変換式を組んだ。

$strOfOct = intval($formData["permission"]);
$third = (int)( $strOfOct / 100);
$second = (int)(($strOfOct % 100) / 10);
$first = (int)( $strOfOct % 10 );
$dec_perms = $third *64 + $second *8 + $first;
chmod($object_files, $dec_perms);

 あっという間に終わった・・・。みんなこうやってるのかな?(そもそもフォームにパーミッションを入力させるとかいう場面が無いか。)