Aktueller Standort: Startseite> Neueste Artikel> Können die OCTDEC- und DECOCT -Funktionen von PHP zur Implementierung der bidirektionalen Konvertierung zwischen Oktal und Dezimal verwendet werden?

Können die OCTDEC- und DECOCT -Funktionen von PHP zur Implementierung der bidirektionalen Konvertierung zwischen Oktal und Dezimal verwendet werden?

gitbox 2025-09-12

—— 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.

1. Grundnutzung

 <span><span><span class="hljs-meta">&lt;?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.

2. Häufige Fallen und Grenzen

(1) illegale Charaktere

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">&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">// 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>

(2) Führung 0 und das "Oktalwörtel" im Code

  • 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.

(3) negative Anzahl und Bitbreite

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">&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">// Variiert je nach Plattform,Normalerweise eine lange Saite</span></span><span>
</span></span>

(4) DIVE Ganzzahlen

  • 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.

3. Praktisches Paket: robuste bidirektionale Konvertierung

Oktalzeichenfolge → Dezimal (zurück zu 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">"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>

Dezimal (nicht negative int ) → Oktalschnur

 <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">"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>

Fortgeschrittene: Unterstützt super große Zahlen mit 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">"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.

4. Vergleich mit Base_Convert ()

Base_Convert (String $ num, int $ von, int $ bis) kann auch binäre Conversion implementieren, beispielsweise:

 <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>

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.

5. Zusammenfassung

  • 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.