—— Inhaltsteiler, der nichts mit dem Text zu tun hat -
Sagen wir zuerst: Ja . OCTDEC () wird verwendet, um Oktalzeichenfolgen → Dezimalzahlen zu verwenden, und DeCoct () wird verwendet, um Dezimalzahlen → Oktalketten zu verwenden. Die Kombination der beiden kann eine Zwei-Wege-Umwandlung erreichen. Das Folgende ist eine klare Erklärung für die Verwendung, die leicht zu machenden Punkte und die fortschrittlichen Lösungen.
<span><span><span class="hljs-meta"><?php</span></span><span>
</span><span><span class="hljs-comment">// Oktal → Dezimal</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(Das führende Zeichen in der Saite 0 Wird die Bedeutung nicht ändern,它仍按Oktal解析)</span></span><span>
</span><span><span class="hljs-comment">// Dezimal → Oktal</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>Schlüsselpunkte:
OCTDEC (String $ Octal): int —— Der Parameter ist eine Zeichenfolge , die eine Dezimalbezahlung zurückgibt.
Decoct (int $ decimal): String - Argumente sind Ganzzahlen , die Oktalstränge zurückgeben.
Octal erlaubt nur 0–7 . Nachdem sie an Charakteren wie 8, 9 oder nicht numerischem an den ersten illegalen Standort ignoriert werden, steht das Ergebnis leicht nicht mit Ihren Erwartungen wider. Es ist am sichersten , zuerst zu überprüfen und dann zu konvertieren .
<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">// Blei zulassen 0;至少一个Oktal数字</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">// illegal</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">"不是合法的Oktal数:<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>Die Zeichenfolge "011" ist nur Text, und OctDec ("011") wird in Oktal auf 9 analysiert.
Die gesamte numerische Oberflächenmenge im PHP -Code , wenn es als 011 geschrieben ist, ist dies die Oktalwörtungsmenge (gleich dezimaler 9). Es wird empfohlen, die Verwendung von Ganzzahlen mit führenden 0 im Quellcode zu vermeiden, um Verwirrung zu vermeiden. Eine klarere Möglichkeit, Saiten mit OctDec () zu verwenden, wenn Oktal erforderlich ist.
Das Argument für decoct () ist eine Ganzzahl. Bei negativen Zahlen nimmt es an der Operation in Two's Komplement gemäß der Bitbreite der Implementierungsplattform (normalerweise 64 Bit) teil und gibt eine Oktaldarstellung, die "lang" aussieht, was normalerweise nicht das gewünschte Ergebnis ist. Wenn es keine besonderen Anforderungen gibt, behandeln Sie bitte nur nicht negative Ganzzahlen.
<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">// Variiert je nach Plattform,Normalerweise eine lange Saite</span></span><span>
</span></span>Bei 64-Bit-PHP beträgt der maximale int ca. 9,22E18. decoct () unterliegt dieser Einschränkung.
Wenn Sie sich mit Conversions von extrem großen Dezimalzahlen befassen müssen (über den Int -Bereich überschreiten), sollten Sie:
Verwenden Sie GMP_* (wie gmp_init + gmp_strval ($ n, 8) );
Oder verwenden Sie BC /Self-Write-Algorithmus mit großem Zahlen.
Wenn Oktal → Dezimaler ist, gibt OctDec () int zurück, was ebenfalls eingeschränkt ist; Wenn es den Code überschreitet, verwenden Sie stattdessen das GMP / BC -Schema.
<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">"illegalOktal:<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">"Es werden nur nicht negative Ganzzahlen unterstützt"</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">"illegalOktal:<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">// 返回Dezimal“Saite”</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">"illegalDezimal:<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>Tipp: Die GMP -Erweiterung muss in der Umgebung aktiviert werden. Wenn GMP nicht verwendet werden kann, kann eine digitalisierte Konvertierung mit BC oder reinem PHP implementiert werden.
Base_Convert (String $ num, int $ von, int $ bis) kann auch binäre Conversion implementieren, beispielsweise:
<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>Unterschiede und Kompromisse:
Basis_Convert () Eingabe/Ausgabemarions sind beide Zeichenfolgen , die näher an der Semantik der "textbasierten Konvertierung" liegen.
octDec ()/decoct () liegt näher an der "Octal? Decimal" -Dedizierten API mit klarer Semantik, und OctDec () gibt int int direkt zurück, was einfach zu bedienen ist.
Base_convert () wird in einigen Szenarien durch Implementierung und Präzision begrenzt. Um absolut sicher zu sein, wird immer noch empfohlen, GMP / BC zu verwenden.
Antwort: Ja. Verwenden Sie OctDec () (Oktal String → Dezimal int ) und decoct () (Dezimal int → Oktalstring), um eine bidirektionale Konvertierung zu erreichen.
Bitte beachten Sie in der Produktionspraxis: Eingangsüberprüfung, negativer Zahlenverarbeitung, Unklarheit der führenden 0 der ganzzahligen Oberflächenmenge und Überlauf der großen Ganzzahlen . Wenn große Zahlen benötigt werden, ist es robuster, GMP / BC -Lösungen auszuwählen.