- テキストとは何の関係もないコンテンツディバイダー -
最初に:はい。 Octdec()は、Octal Strings→Decimal Integersを使用するために使用され、 DeCoct()は10進整数→Octal Stringsを使用するために使用されます。 2つの組み合わせは、双方向変換を実現できます。以下は、使用状況、ミスが容易なポイント、高度なソリューションの明確な説明です。
<span><span><span class="hljs-meta"><?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は整数であり、オクタル文字列を返します。
Octalは0〜7のみを許可します。 8、9 、または非数などのキャラクターを渡すと、最初の違法な場所に無視されます。結果は、あなたの期待と矛盾します。最初に確認してから変換するのが最も安全です。
<span><span><span class="hljs-meta"><?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>文字列「011」は単なるテキストであり、 Octdec( "011")はOctalで9に解析されます。
PHPコードの数値表面数量全体が011として記述されている場合、これはオクタルリテラル量(小数9に等しい)です。混乱を読むことを避けるために、ソースコードのリーディング0を持つ整数数字を使用しないようにすることをお勧めします。 OCTALが必要なときにOCTDEC()で文字列を使用するためのより明確な方法。
decoct()への議論は整数です。負の場合、実装プラットフォームのビット幅(通常は64ビット)に応じて2人の補数の操作に参加し、「長い」ように見えるオクタル表現を提供しますが、これは通常、必要な結果ではありません。特別な要件がない場合は、非陰性整数のみを処理してください。
<span><span><span class="hljs-meta"><?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>64ビットPHPでは、最大INTは約9.22E18です。 decoct()はこの制限の対象となります。
非常に大きな小数点以下のコンバージョンに対処する必要がある場合( INT範囲を超えて)、次のことを検討してください。
gmp_* ( gmp_init + gmp_strval($ n、8)など)を使用します。
または、 BC /自己執筆多数のアルゴリズムを使用します。
Octal→10進数の場合、 Octdec()はintを返します。これも制限されています。コードを超える場合は、代わりにGMP / BCスキームを使用してください。
<span><span><span class="hljs-meta"><?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> <span><span><span class="hljs-meta"><?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> < </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><span><span><span class="hljs-meta"><?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を使用してデジタル化された変換を実装できます。
base_convert(string $ num、int $ from、int $ to)もバイナリ変換を実装できます。
<span><span><span class="hljs-meta"><?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を使用することをお勧めします。
回答:はい。 octdec() (Octal String→Decimal int )およびDeCoct()() (10進→Octal String)を使用して、双方向変換を実現します。
生産慣行に注意してください:入力検証、負の数処理、整数表面量の主要な0のあいまいさ、および大整数のオーバーフロー。多数が必要な場合、 GMP / BCソリューションを選択する方が堅牢です。