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을 다룰 일이 거의 없으니…