現在の位置: ホーム> 最新記事一覧> PHPのOctdecおよびDECOCT機能を使用して、Octalと10進数間の双方向変換を実装できますか?

PHPのOctdecおよびDECOCT機能を使用して、Octalと10進数間の双方向変換を実装できますか?

gitbox 2025-09-12

- テキストとは何の関係もないコンテンツディバイダー -

最初に:はいOctdec()、Octal Strings→Decimal Integersを使用するために使用され、 DeCoct()は10進整数→Octal Stringsを使用するために使用されます。 2つの組み合わせは、双方向変換を実現できます。以下は、使用状況、ミスが容易なポイント、高度なソリューションの明確な説明です。

1。基本的な使用法

<span><span><span class="hljs-meta">&lt;?php</span></span><span>
</span><span><span class="hljs-comment">// オクタル → 小数</span></span><span>
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-title function_ invoke__">octdec</span></span><span>(</span><span><span class="hljs-string">'17'</span></span><span>);   </span><span><span class="hljs-comment">// 15</span></span><span>
</span><span><span class="hljs-keyword">echo</span></span><span> PHP_EOL;
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-title function_ invoke__">octdec</span></span><span>(</span><span><span class="hljs-string">'011'</span></span><span>);  </span><span><span class="hljs-comment">// 9(文字列の主要なキャラクター 0 意味を変えません,它仍按オクタル解析)</span></span><span>

</span><span><span class="hljs-comment">// 小数 → オクタル</span></span><span>
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-title function_ invoke__">decoct</span></span><span>(</span><span><span class="hljs-number">15</span></span><span>);     </span><span><span class="hljs-comment">// "17"</span></span><span>
</span><span><span class="hljs-keyword">echo</span></span><span> PHP_EOL;
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-title function_ invoke__">decoct</span></span><span>(</span><span><span class="hljs-number">9</span></span><span>);      </span><span><span class="hljs-comment">// "11"</span></span><span>
</span></span>

キーポイント:

  • Octdec(String $ octal):int -パラメーターは文字列であり、小数整数を返します。

  • decoct(int $ $ decimal):string - argumentsは整数であり、オクタル文字列を返します。

2。一般的なトラップと境界

(1)違法なキャラクター

Octalは0〜7のみを許可します。 8、9 、または非数などのキャラクターを渡すと、最初の違法な場所に無視されます。結果は、あなたの期待と矛盾します。最初に確認してから変換するのが最も安全です。

 <span><span><span class="hljs-meta">&lt;?php</span></span><span>
</span><span><span class="hljs-function"><span class="hljs-keyword">function</span></span></span><span> </span><span><span class="hljs-title">isValidOctal</span></span><span>(</span><span><span class="hljs-params"><span class="hljs-keyword">string</span></span></span><span> </span><span><span class="hljs-variable">$s</span></span><span>): </span><span><span class="hljs-title">bool</span></span><span> {
    </span><span><span class="hljs-comment">// リードを許可します 0;至少一个オクタル数字</span></span><span>
    </span><span><span class="hljs-keyword">return</span></span><span> (</span><span><span class="hljs-keyword">bool</span></span><span>)</span><span><span class="hljs-title function_ invoke__">preg_match</span></span><span>(</span><span><span class="hljs-string">'/^[0-7]+$/'</span></span><span>, </span><span><span class="hljs-variable">$s</span></span><span>);
}

</span><span><span class="hljs-variable">$input</span></span><span> = </span><span><span class="hljs-string">'128'</span></span><span>; </span><span><span class="hljs-comment">// 違法</span></span><span>
</span><span><span class="hljs-keyword">if</span></span><span> (!</span><span><span class="hljs-title function_ invoke__">isValidOctal</span></span><span>(</span><span><span class="hljs-variable">$input</span></span><span>)) {
    </span><span><span class="hljs-keyword">throw</span></span><span> </span><span><span class="hljs-keyword">new</span></span><span> </span><span><span class="hljs-built_in">InvalidArgumentException</span></span><span>(</span><span><span class="hljs-string">"不是合法的オクタル数:<span class="hljs-subst">{$input}</span></span></span><span>");
}
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-title function_ invoke__">octdec</span></span><span>(</span><span><span class="hljs-variable">$input</span></span><span>);
</span></span>

(2)リード0とコードの「オクタルリテラル」

  • 文字列「011」は単なるテキストであり、 Octdec( "011")はOctalで9に解析されます。

  • PHPコードの数値表面数量全体が011として記述されている場合、これはオクタルリテラル量(小数9に等しい)です。混乱を読むことを避けるために、ソースコードのリーディング0を持つ整数数字を使用しないようにすることをお勧めします。 OCTALが必要なときにOCTDEC()で文字列を使用するためのより明確な方法。

(3)負の数とビット幅

decoct()への議論は整数です。負の場合、実装プラットフォームのビット幅(通常は64ビット)に応じて2人の補数の操作に参加し、「長い」ように見えるオクタル表現を提供しますが、これは通常、必要な結果ではありません。特別な要件がない場合は、非陰性整数のみを処理してください。

 <span><span><span class="hljs-meta">&lt;?php</span></span><span>
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-title function_ invoke__">decoct</span></span><span>(-</span><span><span class="hljs-number">10</span></span><span>); </span><span><span class="hljs-comment">// プラットフォームによって異なります,通常、長い文字列</span></span><span>
</span></span>

(4)大きな整数

  • 64ビットPHPでは、最大INTは約9.22E18です。 decoct()はこの制限の対象となります。

  • 非常に大きな小数点以下のコンバージョンに対処する必要がある場合( INT範囲を超えて)、次のことを検討してください。

    • gmp_*gmp_init + gmp_strval($ n、8)など)を使用します。

    • または、 BC /自己執筆多数のアルゴリズムを使用します。

  • Octal→10進数の場合、 Octdec()intを返します。これも制限されています。コードを超える場合は、代わりにGMP / BCスキームを使用してください。

3。実用パッケージ:堅牢な双方向変換

Octal String→Decimal( intに戻る)

 <span><span><span class="hljs-meta">&lt;?php</span></span><span>
</span><span><span class="hljs-function"><span class="hljs-keyword">function</span></span></span><span> </span><span><span class="hljs-title">octalToDecimal</span></span><span>(</span><span><span class="hljs-params"><span class="hljs-keyword">string</span></span></span><span> </span><span><span class="hljs-variable">$oct</span></span><span>): </span><span><span class="hljs-title">int</span></span><span> {
    </span><span><span class="hljs-keyword">if</span></span><span> (!</span><span><span class="hljs-title function_ invoke__">preg_match</span></span><span>(</span><span><span class="hljs-string">'/^[0-7]+$/'</span></span><span>, </span><span><span class="hljs-variable">$oct</span></span><span>)) {
        </span><span><span class="hljs-keyword">throw</span></span><span> </span><span><span class="hljs-keyword">new</span></span><span> </span><span><span class="hljs-built_in">InvalidArgumentException</span></span><span>(</span><span><span class="hljs-string">"違法オクタル:<span class="hljs-subst">$oct</span></span></span><span>");
    }
    </span><span><span class="hljs-keyword">return</span></span><span> </span><span><span class="hljs-title function_ invoke__">octdec</span></span><span>(</span><span><span class="hljs-variable">$oct</span></span><span>);
}
</span></span>

小数(非陰性INT )→Octal String

 <span><span><span class="hljs-meta">&lt;?php</span></span><span>
</span><span><span class="hljs-function"><span class="hljs-keyword">function</span></span></span><span> </span><span><span class="hljs-title">decimalToOctal</span></span><span>(</span><span><span class="hljs-params"><span class="hljs-keyword">int</span></span></span><span> </span><span><span class="hljs-variable">$dec</span></span><span>): </span><span><span class="hljs-title">string</span></span><span> {
    </span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$dec</span></span><span> &lt; </span><span><span class="hljs-number">0</span></span><span>) {
        </span><span><span class="hljs-keyword">throw</span></span><span> </span><span><span class="hljs-keyword">new</span></span><span> </span><span><span class="hljs-built_in">InvalidArgumentException</span></span><span>(</span><span><span class="hljs-string">"非陰性整数のみがサポートされています"</span></span><span>);
    }
    </span><span><span class="hljs-keyword">return</span></span><span> </span><span><span class="hljs-title function_ invoke__">decoct</span></span><span>(</span><span><span class="hljs-variable">$dec</span></span><span>);
}
</span></span>

Advanced:GMPで非常に多数をサポートします

<span><span><span class="hljs-meta">&lt;?php</span></span><span>
</span><span><span class="hljs-function"><span class="hljs-keyword">function</span></span></span><span> </span><span><span class="hljs-title">octalToDecimalBig</span></span><span>(</span><span><span class="hljs-params"><span class="hljs-keyword">string</span></span></span><span> </span><span><span class="hljs-variable">$oct</span></span><span>): </span><span><span class="hljs-title">string</span></span><span> {
    </span><span><span class="hljs-keyword">if</span></span><span> (!</span><span><span class="hljs-title function_ invoke__">preg_match</span></span><span>(</span><span><span class="hljs-string">'/^[0-7]+$/'</span></span><span>, </span><span><span class="hljs-variable">$oct</span></span><span>)) {
        </span><span><span class="hljs-keyword">throw</span></span><span> </span><span><span class="hljs-keyword">new</span></span><span> </span><span><span class="hljs-built_in">InvalidArgumentException</span></span><span>(</span><span><span class="hljs-string">"違法オクタル:<span class="hljs-subst">$oct</span></span></span><span>");
    }
    </span><span><span class="hljs-variable">$g</span></span><span> = </span><span><span class="hljs-title function_ invoke__">gmp_init</span></span><span>(</span><span><span class="hljs-variable">$oct</span></span><span>, </span><span><span class="hljs-number">8</span></span><span>);
    </span><span><span class="hljs-keyword">return</span></span><span> </span><span><span class="hljs-title function_ invoke__">gmp_strval</span></span><span>(</span><span><span class="hljs-variable">$g</span></span><span>, </span><span><span class="hljs-number">10</span></span><span>); </span><span><span class="hljs-comment">// 返回小数“弦”</span></span><span>
}

</span><span><span class="hljs-function"><span class="hljs-keyword">function</span></span></span><span> </span><span><span class="hljs-title">decimalToOctalBig</span></span><span>(</span><span><span class="hljs-params"><span class="hljs-keyword">string</span></span></span><span> </span><span><span class="hljs-variable">$dec</span></span><span>): </span><span><span class="hljs-title">string</span></span><span> {
    </span><span><span class="hljs-keyword">if</span></span><span> (!</span><span><span class="hljs-title function_ invoke__">preg_match</span></span><span>(</span><span><span class="hljs-string">'/^[0-9]+$/'</span></span><span>, </span><span><span class="hljs-variable">$dec</span></span><span>)) {
        </span><span><span class="hljs-keyword">throw</span></span><span> </span><span><span class="hljs-keyword">new</span></span><span> </span><span><span class="hljs-built_in">InvalidArgumentException</span></span><span>(</span><span><span class="hljs-string">"違法小数:<span class="hljs-subst">$dec</span></span></span><span>");
    }
    </span><span><span class="hljs-variable">$g</span></span><span> = </span><span><span class="hljs-title function_ invoke__">gmp_init</span></span><span>(</span><span><span class="hljs-variable">$dec</span></span><span>, </span><span><span class="hljs-number">10</span></span><span>);
    </span><span><span class="hljs-keyword">return</span></span><span> </span><span><span class="hljs-title function_ invoke__">gmp_strval</span></span><span>(</span><span><span class="hljs-variable">$g</span></span><span>, </span><span><span class="hljs-number">8</span></span><span>);
}
</span></span>

ヒント:環境でGMP拡張機能を有効にする必要があります。 GMPを使用できない場合、 BCまたはPure PHPを使用してデジタル化された変換を実装できます。

4。base_convert ()との比較

base_convert(string $ num、int $ from、int $ to)もバイナリ変換を実装できます。

 <span><span><span class="hljs-meta">&lt;?php</span></span><span>
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-title function_ invoke__">base_convert</span></span><span>(</span><span><span class="hljs-string">'17'</span></span><span>, </span><span><span class="hljs-number">8</span></span><span>, </span><span><span class="hljs-number">10</span></span><span>); </span><span><span class="hljs-comment">// "15"</span></span><span>
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-title function_ invoke__">base_convert</span></span><span>(</span><span><span class="hljs-string">'15'</span></span><span>, </span><span><span class="hljs-number">10</span></span><span>, </span><span><span class="hljs-number">8</span></span><span>); </span><span><span class="hljs-comment">// "17"</span></span><span>
</span></span>

違いとトレードオフ:

  • base_convert()入力/出力引数はどちらも文字列であり、「テキストベースの変換」のセマンティクスに近いです。

  • Octdec()/decoct()は、「Octal?decimal」専用APIに近く、明確なセマンティクスを備えており、 Octdec()はintを直接返します。これは使いやすいです。

  • 超大型整数に直面する場合、 Base_Convert()は、いくつかのシナリオで実装と精度によって制限されます。絶対に安全であるために、 GMP / BCを使用することをお勧めします。

5。概要

  • 回答:はい。 octdec() (Octal String→Decimal int )およびDeCoct()() (10→Octal String)を使用して、双方向変換を実現します。

  • 生産慣行に注意してください:入力検証、負の数処理、整数表面量の主要な0のあいまいさ、および大整数のオーバーフロー。多数が必要な場合、 GMP / BCソリューションを選択する方が堅牢です。