Position actuelle: Accueil> Derniers articles> Les fonctions OCTDEC et DECOC de PHP peuvent-elles être utilisées pour implémenter une conversion bidirectionnelle entre octal et décimal?

Les fonctions OCTDEC et DECOC de PHP peuvent-elles être utilisées pour implémenter une conversion bidirectionnelle entre octal et décimal?

gitbox 2025-09-12

—— Diviseur de contenu qui n'a rien à voir avec le texte -

Disons d'abord: oui . OCTDEC () est utilisé pour utiliser des chaînes octales → des entiers décimaux , et DeCoct () est utilisé pour utiliser des entiers décimaux → les chaînes octales . La combinaison des deux peut atteindre une conversion bidirectionnelle. Ce qui suit est une explication claire de l'utilisation, des points faciles à manquer et des solutions avancées.

1. Utilisation de base

 <span><span><span class="hljs-meta">&lt;?php</span></span><span>
</span><span><span class="hljs-comment">// Octal → Décimal</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(Le personnage principal de la chaîne 0 Ne changera pas le sens,它仍按Octal解析)</span></span><span>

</span><span><span class="hljs-comment">// Décimal → Octal</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>

Points clés:

  • OctDec (String $ octal): int —— Le paramètre est une chaîne , renvoyant un entier décimal.

  • Decoct (int $ décimal): String —— Les arguments sont des entiers , retournant les chaînes octales.

2. Tipes et limites communes

(1) caractères illégaux

Octal n'autorise que 0 à 7 . Après avoir transmis des personnages tels que 8, 9 ou non nucères seront ignorés au premier emplacement illégal, le résultat sera facilement incompatible avec vos attentes. Il est le plus sûr de vérifier d'abord puis de convertir .

 <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">// Permettre le plomb 0;至少一个Octal数字</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">// illégal</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">"不是合法的Octal数:<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) plomb 0 et "littéral octal" dans le code

  • La chaîne "011" est juste du texte, et OctDec ("011") sera analysé à 9 en octal.

  • La quantité entière de surface numérique dans le code PHP S'il est écrit comme 011 , il s'agit de la quantité littérale octale (égale à décimal 9). Il est recommandé d'éviter d'utiliser des chiffres entiers avec un leader 0 dans le code source pour éviter de lire la confusion; Une façon plus claire d'utiliser des chaînes avec OCTDEC () lorsque Octal est requis.

(3) nombre négatif et largeur de bit

L'argument de décoct () est un entier. Lorsque les nombres négatifs participent à l'opération du complément de deux en fonction de la largeur du bit de la plate-forme de mise en œuvre (généralement 64 bits) et donne une représentation octale qui semble "longue", ce qui n'est généralement pas le résultat que vous souhaitez. S'il n'y a pas d'exigence spéciale, veuillez ne gérer que des entiers non négatifs.

 <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">// Varie selon la plate-forme,Habituellement une longue chaîne</span></span><span>
</span></span>

(4) grands entiers

  • Sur le PHP 64 bits, l' int maximum est d'environ 9,22E18. DECOCT () est soumis à cette restriction.

  • Si vous devez faire face aux conversions de nombres décimaux extrêmement importants (dépassant la plage int ), considérez:

    • Utilisez GMP_ * (comme GMP_INIT + GMP_STRVAL ($ n, 8) );

    • Ou utilisez un algorithme de grand nombre BC / auto-écriture.

  • Lorsque octal → décimal, octdec () renvoie int , qui est également restreint; S'il dépasse le code, veuillez utiliser le schéma GMP / BC à la place.

3. Package pratique: conversion bidirectionnelle robuste

String octal → décimal (retour à 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">"illégalOctal:<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>

Décimal (non négatif) → chaîne octale

 <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">"Seuls les entiers non négatifs sont soutenus"</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: prend en charge des nombres super grands avec 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">"illégalOctal:<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">// 返回Décimal“Chaîne”</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">"illégalDécimal:<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>

Astuce: l'extension GMP doit être activée dans l'environnement; Si GMP ne peut pas être utilisé, la conversion numérisée peut être implémentée à l'aide de BC ou de PHP pur.

4. Comparaison avec base_convert ()

Base_Convert (String $ num, int $ from, int $ to) peut également implémenter la conversion binaire, par exemple:

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

Différences et compromis:

  • Base_Convert () Les arguments d'entrée / sortie sont tous deux des chaînes , qui sont plus proches de la sémantique de "conversion textuelle";

  • OCTDEC () / DECOCT () est plus proche de l'API dédiée "Decimal" Octal? Decimal ", avec sémantique claire, et OctDec () renvoie directement INT , qui est facile à utiliser;

  • Lorsqu'il est confronté à des entiers super grands, Base_Convert () sera limité par la mise en œuvre et la précision dans certains scénarios; Pour être absolument en sécurité, il est toujours recommandé d'utiliser GMP / BC .

5. Résumé

  • Réponse: Oui. Utilisez OCTDEC () (chaîne octale → Decimal int ) et DECOCT () (Decimal int → String octal) pour atteindre la conversion bidirectionnelle.

  • Veuillez noter dans la pratique de la production: vérification des entrées, traitement négatif du nombre, ambiguïté du principal 0 de la quantité de surface entière et débordement de grands entiers . Lorsque de grands nombres sont nécessaires, il est plus robuste de choisir des solutions GMP / BC .