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진수의 값이 표시되는 것을 볼 수 있다~