Java short / byte array 변환

이번 업무에서 소켓통신을 처리하는 부분이 있어 2주 정도 삽질을 했다. 예전 직장에서 열심히 공부해서 잘 만들었던걸로 기억하는데, 도무지 기억이…(하긴 5년 정도는 지난거 같으니)

각설하고, 공문으로 내려온 전문규격서상의 수치 부분이 User type, n byte로만 두루뭉실하게 되어 있었는데, 실제 측정값을 보내주는 업체 중 한 곳에서 먼저 그들이 보내고자 하는 양식을 보내줘 확인해 보니 signed short으로 되어 있었다.

공문으로 내려온 해당 데이터에 대한 데이블 명세는 number(8, 3)으로 되어 있어서 나는 double형으로 받으려고 했는데, 뭐 DDL script 수정하는것 보다는 내가 적절히 변환해서 저장하는 방식이 좋을듯 해서 열심히 구글링을 했다.

우선 Big endian으로 처리하기로 되어 있으니 다음과 같이 처리 했다(주는 쪽에서도 Big endian방식으로 줄 경우).

short _value = -1237; // 마지막 7은 소수점 첫번째 자리임
byte[] _byte_value = new byte[2];

_byte_value[0] = (byte)((_value >> 8) & 0xFF);
_byte_value[1] = (byte)(_value & 0xFF);

short _convert = 0;
_convert |= (((short)_byte_value[0]) << 8) & 0xFF00;
_convert |= ((short)_byte_value[1]) & 0xFF;

System.out.println("converted : " + _convert);

// DB 저장을 위한 변환
double _data = Double.valueOf(String.format("%.3f", (_convert / 10.0)));

System.out.println("_data : " + _data);

다음은 혹시나 해서 테스트 해본 Little endian 방식이다.

short _value = -1237; // 마지막 7은 소수점 첫번째 자리임
byte[] _byte_value = new byte[2];

_byte_value[0] = (byte)(_value & 0xFF);
_byte_value[1] = (byte)((_value >> 8) & 0xFF);

short _convert = 0;
_convert |= ((short)_byte_value[0]) & 0xFF;
_convert |= (((short)_byte_value[1]) << 8) & 0xFF00;

System.out.println("converted : " + _convert);

// DB 저장을 위한 변환
double _data = Double.valueOf(String.format("%.3f", (_convert / 10.0)));

System.out.println("_data : " + _data);

그리고 Java의 Random은 short 타입을 반환할 수 없다. 따라서 이 때는 다음과 같은 방식으로 처리한다(참고 : Stack overflow).

short s = (short)Random.nextInt(Short.MAX_VALUE + 1);

어찌보면 전공자 입장에서는 기본중의 기본이라 할 수 있는 내용들인데, 어쩌겠냐… 비전공자이면서 입에 풀칠하기 바빴으니. 그리고 웹 개발하면서 primitive type을 다룰 일이 거의 없으니…