PHP에서 함수가 바이너리 세이프하다는 것은 무엇을 의미합니까?

PHP함수가 되는 것은 무엇을 의미합니까?

무엇이 특별하고 일반적으로 어디에 사용되는가?



질문에 대한 답변



즉, 임의의 바이너리 데이터(즉, 비 ASC를 포함하는 문자열)를 전달하면 함수가 올바르게 작동합니다.II 바이트 및/또는 늘바이트).

예를 들어 non-binary-safe 함수는 null-terminated 문자열을 예상하는 C 함수를 기반으로 할 수 있습니다.따라서 문자열에 null 문자가 포함되어 있으면 함수는 그 뒤의 모든 것을 무시합니다.

이는 PHP가 문자열과 이진 데이터를 완전히 분리하지 않기 때문에 관련이 있습니다.




다른 사용자가 이미 언급했습니다.binary safe일반적인 의미입니다.

PHP에서는 Michael이 예시로 제시한 내용만을 언급하여 의미가 더 구체적입니다.

PHP의 모든 문자열에는 길이를 구성하는 바이트 수가 관련되어 있습니다.함수가 문자열을 조작할 때 다음 중 하나를 수행할 수 있습니다.

  1. 그 길이의 메타 데이터에 의존합니다.
  2. 문자열이 null로 종단되는 것에 의존합니다.즉, 실제로 문자열의 일부인 데이터 뒤에 값이 있는 바이트가 표시됩니다.0표시됩니다.

또한 엔진에 의해 조작되는 모든 문자열 PHP 변수도 null 종단됩니다.2.에 의존하는 함수의 문제는 문자열 자체에 값을 가진 바이트가 포함되어 있는 경우입니다.0조작하는 함수는 그 시점에서 문자열이 종료된 것으로 간주하고 그 이후의 모든 것을 무시합니다.

예를 들어 PHP가strlen기능은 C 표준 라이브러리처럼 동작합니다.strlen, 여기서의 결과는 틀립니다.

$str = "abcx00abc"; echo strlen($str); //gives 7, not 3! 



기타 예:

<?php
$string1 = "Hello";
$string2 = "Hellox00World";
// This function is NOT ! binary safe
echo strcoll($string1, $string2); // gives 0, strings are equal.
// This function is binary safe
echo strcmp($string1, $string2); // gives <0, $string1 is less than $string2.
?> 

x는 16진 표기를 나타냅니다.참조: PHP 문자열

0x00 = NULL 0x04 = EOT (End of transmission) 

ASCII 문자 목록을 표시하는 ASCII 테이블