—— 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.
<span><span><span class="hljs-meta"><?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.
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"><?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>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.
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"><?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>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.
<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">"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> <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">"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> <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">"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.
Base_Convert (String $ num, int $ from, int $ to) peut également implémenter la conversion binaire, par exemple:
<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>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 .
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 .