ByteBuffer to String

아래 예는 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 to String”에 대한 3개의 생각

  1. pangli

    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

    그럼, 좋은 주말 되세요.

    혹시 제가 잘못 생각하고

    응답

답글 남기기

이메일은 공개되지 않습니다. 필수 입력창은 * 로 표시되어 있습니다.