2017-11-09 17 views
0

여기 코드 중 하나에 보증이 필요하거나 "아니오, 아니오"라고 표시되어 있습니다. 나는 이것에 대해 오른쪽 또는 완전히 잘못된 방식으로 생각하고 있는지에 관해서입니다.바이너리 데이터 및 mb_function 오버로드 처리?

이 기능은 특정 지점에서 이진 데이터의 변수를 잘라내거나 다중 바이트 오버로드 된 기능을 처리해야합니다. 예를 들어 substr 실제로 mb_substr하고 strlenmb_strlen 등등

우리의 서버는 UTF-8 내부 인코딩, 나는이 바이너리 데이터 조작을 위해 그것을 회피 할 수 있도록 프로그래머 이상한 작은 일에 설정되어

:

// $binary_data is the incoming variable with binary 
// $clip_size is generally 16, 32 or 64 etc 
$curenc = mb_internal_encoding();// this should be "UTF-8" 
mb_internal_encoding('ISO-8859-1');// change so mb_ overloading doesnt screw this up 
if (strlen($binary_data) >= $clip_size) { 
    $first_hunk = substr($binary_data,0,$clip_size); 
    $rest_of_it = substr($binary_data,$clip_size); 
} else { 
    // skip since its shorter than expected 
} 
mb_internal_encoding($curenc);// put this back now 

바이너리 데이터이므로 입력 및 출력 결과를 실제로 표시 할 수 없습니다. 하지만 위의 테스트를 사용하면 잘 작동하는 것처럼 보입니다. 아무 것도 깨지지 않습니다.

그러나 내 머리 부분은 "무엇을하고 계십니까?"이 문제를 처리 할 수있는 방법이 될 수 없습니다!

참고 : 들어오는

  • 바이너리 데이터로 시작하는 두 부분의 연결입니다.
  • 첫 번째 부분의 크기는 항상 알려져 있지만 변경됩니다.
  • 두 번째 부분의 크기는 완전히 알려져 있지 않습니다.
  • 이것은 암호화에 매우 가까우며 앞면에 IV를 채우고 다시 찢어 버립니다 (이상하게도, 나는이 똑같은 일을하는 오래된 코드를 발견했습니다).

그래서, 내 질문은 추측 :

  • 이 실제로 괜찮 일을 할?
  • 아니면 내가 간과하고있는 뭔가 명백한가요?
+0

코드에서 변수를 사용하기 위해 바이너리를 구문 분석하려고합니까? $ first_hunk와 $ rest_of_it의 목적은 무엇입니까? – rlanvin

+0

최종 목적은 다소 모호 합니다만, 나는 들어 가지 않을 것입니다.) ...하지만이 작업이 끝나면 첫 번째 변수와 두 번째 변수가 원래 바이너리 데이터의 두 부분으로 끝나야한다고 말할 수 있습니다 (클립 길이) (이상한 방법을 사용하면 OK입니다). – IncredibleHat

+0

바이너리에 대한 메모를 더 추가했습니다. – IncredibleHat

답변

0

내 걱정 난 내 자신의 질문에 대답 싫어하는

TO 해결 ...하지만 난 그럼에도 불구하고 결정 것을 공유하고 싶었다.

"근무 했었지만"여전히 charset 인코딩의 해킹 작업을 변경하고 싶었습니다. 그것은 내가 인정하는 오래된 코드 였지만, 어떤 이유로 든 나는 이것을 결코 보지 못했다. hex2binbin2hex. 그래서 나는 그것을 사용하기 위해 그것을 바꾸기로 결정했다.

결과 새로운 코드 : 육각 기능을 사용

// $clip_size remains the same value for continuity later, 
// only spot-adjusted here... which is why the *2. 
    $hex_data = bin2hex($binary_data); 
    $first_hunk = hex2bin(substr($hex_data,0,($clip_size*2))); 
    $rest_of_it = hex2bin(substr($hex_data,($clip_size*2))); 
    if (!empty($rest_of_it)) { /* process the result for reasons */ } 

은 어느 방법을 나사하지 않습니다 뭔가 메가로 엉망으로 변합니다. 1 백만 개의 벤치 루프는 프로세스가 걱정할 사항이 아니라는 것을 보여주었습니다. (그리고 mb_encoding mangle 메서드보다 자체적으로 병렬로 실행하는 것이 더 안전합니다).

그래서이 문제를 해결하겠습니다. 그것은 내 마음 속에 더 잘 앉고, 지금 내 질문을 해결한다 ... 내가 몇 년 후에 다시이 오래된 코드를 다시 살펴보고 "내가 생각한 것은 무엇 이었니?".

1

하지만, 내 뇌의 부분은 "당신이 무엇을하고 있는지 ...이이 문제를 해결할 수있는 방법이 될 수 없다"비명을 지르고있다!

두뇌가 맞습니다. PHP에서 처음부터 그렇게해서는 안됩니다. :)

이 작업을 수행하는 것이 실제로 괜찮습니까?

코드 목적에 따라 다릅니다.

내 머리 꼭대기에서 바이너리를자를 이유가 없습니다. 그래서 내 첫 번째 본능은 "아니, 안돼!" unpack()을 사용하여 이진을 사용 가능한 변수로 올바르게 구문 분석하십시오.

왜냐하면 이유가 있기 때문에 바이너리를 분할해야한다고 말하면 괜찮습니다. 테스트에서 코드가 작동하는지 확인하는 한 아무런 문제가 없습니다.

보조 노트로, 나는이 종류의 유스 케이스에 대해 mbstring 오버로드를 사용하지 않는다. 즉, 기본 문자열 함수가 필요할 때마다.

+0

오른쪽. 처음에는 이런 혼란을 야기한 멀티 바이트 오버로딩. 그래서 내가 그 switchoverback 않습니다. 비트 연산자 중 일부를 파고 있지만 바이너리 조작이 내 장점 중 하나가 아니라는 것을 인정해야합니다. – IncredibleHat

+1

shift와 같은 비트 연산자는 피연산자를 정수로 처리하기 때문에 작동하지 않습니다. – rlanvin