質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

2回答

4219閲覧

base_convertで16進数を36進数に変換したいです

katsukihi

総合スコア10

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

1グッド

0クリップ

投稿2016/12/09 01:53

編集2016/12/09 02:20

PHP5.3を使っています。

PHP

1$tmp = bin2hex(openssl_random_pseudo_bytes(128)); 2var_dump($tmp); echo "<br>"; 3$tmp2= base_convert($tmp,16,36); 4var_dump($tmp2); echo "<br>"; 5$tmp3 = base_convert($tmp2,36,16); 6var_dump($tmp3); echo "<br>";

以上のようにすると、$tmp20gooog08osgg8kgg44cc4s44c4kkkcwc…のように特定の文字しか出ない、偏った値になります。$tmp3に至っては0が並んでいるだけです($tmpと同じになるはずですよね)。何が原因なのか全く分かりません。うまく0-9a-zまで使われるようにするためにはどうすれば良いのでしょうか?よろしくお願いします。

追記

PHP

1$tmp = bin2hex(openssl_random_pseudo_bytes(8)); // 短くしました 2var_dump($tmp); echo "<br>"; 3$tmp2= base_convert($tmp,16,36); 4var_dump($tmp2); echo "<br>"; 5$tmp3 = base_convert($tmp2,36,16); 6var_dump($tmp3); echo "<br>";

結果
string(16) "ae130497bdec2f94"
string(13) "2nar3567tdusw"
string(16) "ae130497bdec3800"
どうやら短い場合でも最後の方が合わなくなるみたいです。

Y.H.👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

PHP の base_convert のマニュアルに警告としてありますが、大きな数値を変換するときに桁落ちが発生します。
これは base_convert が内部的に数値を一旦 double ないし float に変換しているためです。このことから、実質的に利用できる有効桁数は(double である場合)10進数で15桁程度であると考えられます。

回避策は、やはり同マニュアルにありますが、base_convert を使わずに自作することのようです。

投稿2016/12/09 02:40

tacsheaven

総合スコア13703

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

katsukihi

2016/12/09 03:29

ありがとうございました。 レンタルサーバを使っていて、自由にインストールができないので厳しそうです。 マニュアルページの自作した方のも確認しましたが、当方のサーバにはbcmathが入っておらずお手上げ状態です。
tacsheaven

2016/12/09 03:40

PHP 5.3 ならば bcmath は標準ですが、コンパイルオプションで disable にされたものが提供されているんでしょうかね。 phpinfo(); の結果で確認されてはいかがでしょうか。
guest

0

ベストアンサー

PHPのbase_convertのマニュアル警告されていますが、

警告 大きな数値で base_convert() を使用すると、 精度が失われてしまうことがあります。これは、内部で使用している "double" や "float" の性質によるものです。詳細な情報や制限については マニュアルの浮動小数点数 のセクションを参照ください。

ということで、base_convertは53ビット(IEEE doubleの仮数部)しか精度がありません。

(用意されていれば)GMPはメモリのある限りの桁を扱えますので、gmp_initで16進数表現をGMPに変換して、gmp_strvalで36進数として出力させる、ということができます。

投稿2016/12/09 02:38

編集2016/12/09 02:44
maisumakun

総合スコア145183

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

katsukihi

2016/12/09 03:29

ありがとうございました。 レンタルサーバを使っていて、自由にインストールができないので厳しそうです。 マニュアルページの自作した方のも確認しましたが、当方のサーバにはbcmathが入っておらずお手上げ状態です。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問