현재 위치: > 최신 기사 목록> PHP의 Octdec 및 Decoct 기능을 사용하여 옥탈과 소수점 사이의 양방향 변환을 구현할 수 있습니까?

PHP의 Octdec 및 Decoct 기능을 사용하여 옥탈과 소수점 사이의 양방향 변환을 구현할 수 있습니까?

gitbox 2025-09-12

—— 텍스트와 관련이없는 컨텐츠 분배기 -

먼저 말씀 드리겠습니다. . Octdec ()는 옥탈 문자열 → 소수 정수를 사용하는 데 사용되며 Decoct ()는 10 진수 정수 → 옥탈 문자열을 사용하는 데 사용됩니다. 둘의 조합은 양방향 변환을 달성 할 수 있습니다. 다음은 사용, 미스 포인트 및 고급 솔루션에 대한 명확한 설명입니다.

1. 기본 사용

 <span><span><span class="hljs-meta">&lt;?php</span></span><span>
</span><span><span class="hljs-comment">// 10 월 → 소수</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 의미를 바꾸지 않습니다,它仍按10 월解析)</span></span><span>

</span><span><span class="hljs-comment">// 소수 → 10 월</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) : 문자열 —— 경사는 정수이며 , 옥탈 문자열을 반환합니다.

2. 일반적인 함정과 경계

(1) 불법 인물

옥탈은 0-7 만 허용합니다. 8, 9 또는 비 숫자와 같은 캐릭터를 전달한 후 첫 번째 불법 위치로 무시됩니다. 결과는 기대치와 쉽게 일치하지 않습니다. 먼저 확인한 다음 변환하는 것이 가장 안전합니다.

 <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">// 리드 허용 0;至少一个10 월数字</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">"不是合法的10 월数:<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) 코드의 리드 0 및 "옥탈 리터럴"

  • 문자열 "011" 은 단지 텍스트이며 Octdec ( "011")은 10 월 9 일에 구문 분석됩니다.

  • PHP 코드의 전체 수치 표면 수량은 011 로 작성된 경우, 이것은 옥탈 문자 수량 (10 진수 9와 같습니다)입니다. 혼란을 읽지 않기 위해 소스 코드에서 0이있는 정수 숫자를 사용하지 않는 것이 좋습니다. 옥탈이 필요한 경우 Octdec () 와 함께 문자열을 사용하는 명확한 방법.

(3) 음수 및 비트 너비

Decoct ()에 대한 주장은 정수입니다. 음수 일 때, 구현 플랫폼의 비트 너비 (보통 64 비트)에 따라 2의 보완에서 작동에 참여하고 "긴"보이는 옥탈 표현을 제공하는데, 이는 일반적으로 원하는 결과가 아닙니다. 특별한 요구 사항이없는 경우, 음이 아닌 정수 만 처리하십시오.

 <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">// 플랫폼마다 다릅니다,보통 긴 줄</span></span><span>
</span></span>

(4) 큰 정수

  • 64 비트 PHP에서 최대 INT 는 약 9.22E18입니다. Decoct () 는이 제한을받습니다.

  • 매우 큰 소수점 숫자 ( int 범위 초과)의 변환을 처리 해야하는 경우 다음을 고려하십시오.

    • gmp_* (예 : gmp_init + gmp_strval ($ n, 8) );

    • 또는 BC /Self-Write 다수 알고리즘을 사용하십시오.

  • Octal → Decimal 인 경우 Octdec ()는 int를 반환하며, 이는 또한 제한됩니다. 코드를 초과하는 경우 대신 GMP / BC 체계를 사용하십시오.

3. 실용 패키지 : 강력한 양방향 전환

옥탈 문자열 → 소수점 ( 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">"불법적인10 월:<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>

10 진수 (비 음성 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">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">"비 음성 정수 만 지원됩니다"</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 : 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">"불법적인10 월:<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 또는 순수한 PHP를 사용하여 디지털화 된 변환을 구현할 수 있습니다.

4. base_convert () 와 비교

base_convert (String $ num, int $ from, int $ to) 도 바이너리 변환을 구현할 수 있습니다.

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

차이점과 트레이드 오프 :

  • base_convert () 입력/출력 인수는 둘 다 문자열이며 , 이는 "텍스트 기반 변환"의 의미에 더 가깝습니다.

  • Octdec ()/decoct () 는 명확한 의미론을 가진 "Octal? Decimal"전용 API에 더 가깝고 Octdec ()는 INT를 직접 반환합니다. 이는 사용하기 쉽습니다.

  • 슈퍼 큰 정수에 직면 할 때 Base_Convert ()는 일부 시나리오에서 구현 및 정밀도에 의해 제한됩니다. 절대적으로 안전하려면 여전히 GMP / BC를 사용하는 것이 좋습니다.

5. 요약

  • 답 : 예. Octdec () (Octal String → Decimal Int ) 및 Decoct () (Decimal Int → Octal String)를 사용하여 양방향 변환을 달성하십시오.

  • 생산 관행에서 : 입력 검증, 음수 처리, 정수 표면 수량의 주요 0의 모호성 및 큰 정수의 오버플로 . 많은 수가 필요한 경우 GMP / BC 솔루션을 선택하는 것이 더 강력합니다.