아래 예는 ByteBuffer를 String으로 변환하는 예제이다.
ByteBuffer buffer = ByteBuffer.allocate(1024); buffer.put(“aabcde”.getBytes()); byte[] bytes = new byte[buffer.remaining()]; buffer.get(bytes); String s = new String(bytes); 위가 아니라 아래처럼 해야 됩니다. ^^;; ByteBuffer buffer = ByteBuffer.allocate(1024); buffer.put(“aabcde”.getBytes()); byte[] bytes = new byte[buffer.position()]; buffer.flip(); buffer.get(bytes); String s = new String(bytes); System.out.println(s);
ByteBuffer 관련해서 코드를 찾아보다가 마침 이 포스팅을 보게 되었네요.
그런데 코드에 약간 이상한 부분이 있어 글을 남김니다.
buffer.put() 함수를 이용하면 삽입되는 데이터 길이만큼 buffer의 position이 움직이게 됩니다. 여기에 remaining() 함수를 부르게 되면 1024-(데이터길이) 의 값이 리턴되죠.
이건 원하는 데이터 길이가 아니므로 문제가 생길 수 있을 것 같습니다.
그리고 buffer.get() 함수는 현재 position 부터 buffer에 들어있는 데이터를 (끝까지) 인자로 넣어주는 byte[]에 복사하는 함수입니다.
코드에서 현재 position 은 buffer.put() 함수를 한 후 초기화 되지 않았으므로 삽입된 데이터 다음 위치로 설정되어 있고 이 상태에서 get() 함수를 호출하면 원하는 데이터는 복사되지 않습니다.
아마도 get() 함수 전에 buffer.flip() 이나 buffer.position(0) 등을 사용하면 해결할 수 있지 않을까요?
우선 이렇게 수정하여 테스트를 해 보니 잘 동작하는 것 같습니다.
아래는 수정한 코드 전문입니다.
public static void main(String[] args){
String strData = “aabcde”;
ByteBuffer buffer = ByteBuffer.allocate(1024);
buffer.put( strData.getBytes() );
byte[] bytes = new byte[strData.length()];
buffer.position(0);
buffer.get(bytes);
String s = new String(bytes);
System.out.println(s);
}
혹시 제가 잘못 알고 있거나 실수가 있다면 아래의 메일로 알려주시기 바랍니다. ^^;;;
pangli@naver.com
그럼, 좋은 주말 되세요.
혹시 제가 잘못 생각하고
흠.. 지적 감사드립니다..
제가 지금 코드를 바도 테스트도 안한 멍청한 코드네요.. ^^
ㅋㅋ 감사합니다. ^^
두분다 감사합니다.