하츠의 꿈

16진수(Hex) -> 2진수(Bin) 변환 - PHP예제 본문

엔지니어스 마인드/PHP

16진수(Hex) -> 2진수(Bin) 변환 - PHP예제

명섭이 2009. 4. 28. 18:21

0x00 ~0xFF, 즉 16진수를 말한다.
여기서 "0x" 를 제외한 나머지 2자리 문자가 의미를 갖는다. (다 아는 내용^^;)

타 시스템과 통신을 할 때 이 16진수 헥사코드를 이용하여 데이터를 주고 받는 경우가 많다.
얼마 전에 16진수로 값을 받아서 일부 몇byte를 다시 bit로 해석해야 하는 일이 생겼다.
후배에게 작업을 맡겼는데 어렵다고 해서 설명을 하다가 정리 해 보기로 했다
.

소켓으로 날아 온 전문 : 000003e801e00000e995 (총 10 bytes)

각 byte 별 값의 정의

  - 1,2 bytes : 장비명 ( <- "0000" )
  - 3.4 bytes : 모델명 ( <- "03e8" )
  - 5 byte : 상태 ( <- "01" )
  - 6 byte : 비트 별(0~7)로 알람을 표시 ( <- "e0" )
  - 7 byte : 예비 1 ( <- "00" )
  - 8 byte : 예비 2 ( <- "00" ) 
  - 9 byte : CRC1  ( <- "e9" )
  -10 byte : CRC2 ( <- "95" )



다른 것은 잘라서 사용하면 되지만, 6byte 자리의 값은 그대로 사용할 수가 없다.
6byte 자리의 값은 비트 별로
알람을 표시한다고 했는데 그것은 아래와 같다.
   - 0 bit : 항목0의 상태 값( 정상 or 불량 )
   - 1 bit : 항목1의 상태 값( 정상 or 불량 )
   - 2 bit : 항목2의 상태 값( 정상 or 불량 )
   - 3 bit : 항목3의 상태 값( 정상 or 불량 )
     .

     .
     .

그럼 어떻게 할까?  의외로 간단하다.

 6byte 자리의 2개 문자(여기서는 "e0")를 2진수로 변환하면 비트별 상태값을 알 수 있다.
   - 16진수 "e0" ==> 2진수 "11100000" 

 PHP에서의 처리 
  $dec =
hexdec("e0");  // 16진수를 10진수로 변환 
  $bin = decbin($dec);   // 10진수를 다시 2진수로 변환
  echo $bin;   // "11100000" 출력된다.

즉, e0 라는 16진수를  2진수로 변환하면 항목0, 항목1, 항목2 의 값이 "1"이고, 나머지는 항목의 값은 "0"이 된다.
아마도 값이 "0"인 항목이 문제가 있는 것이겠지?

 모든 항목에 문제가 없다면, 6byte 자리에 "00" 이 올 것이고,
 모든 항목에 문제가 있다면, 6byte 자리에 "FF" 가 올 것이라는 것을 추측할 수 있다~

잘 모르겠으면 윈도의 계산기를 이용해서 확인해 볼 수 있다.

1. 윈도우의 시작->보조프로그램->계산기 를 실행한다.
2. 계산기의 [보기]-> 공학용 을 선택한 후 "Hex"를 선택(16진수)하고 FF 를 입력한다.
3. 다시 "Bin"을 선택(2진수)하면 2진수의 값이 표시되는 것을 볼 수 있다~

Comments