월별 글 목록: 2008년 10월월

자바 API 클래스 다이어그램을 볼 수 있는 서비스

개발하면서 API 문서를 확인하는 일은 “바늘과 실”만큼 연관성이 매우 높다. 하지만 API 문서만으론 API 클래스의 구조에 대해서 쉽게 알기 힘들다. 그래서 확인해보니, 클래스 다이어그램으로 자바 API의 구조를 확인할 수 있는 서비스가 있다.

http://www.falkhausen.de/en/index.html

아래 이미지는 java.nio.channels 패키지의 Channel 인터페이스와 연관된 클래스 다이어그램이다. 한눈에 Channel과 연관된 클래스의 구조를 확인할 수 있다.

class file has wrong version 50.0, should be 4x.0

갑자기 아래의 에러가 발생하면서 컴파일이 안 되네요..

class file has wrong version 50.0, should be 4x.0

원인을 찾아보니, 아래와 같은 문제로 발생한다고 한다.

errors are caused by a Java version mismatch between the compiled proxies and your runtime

아래는 컴파일러 버전과 Java 런타임 버전에 대한 내용이다.

Version 50.0 = Java 1.6.x
Version 49.0 = Java 1.5.x
Version 48.0 = Java 1.4.x

Get and put unsigned values to a ByteBuffer

자바(Java)는 기본적으로 unsigned primitive type을 지원하지 않는다. 만약, C/C++을 사용하는 서버/클라이언트의 프로토콜에 unsigned 타입이 선언되어 있다면 자바에서 unsigned type에 대한 처리가 필요하다. 찾아보니, 구글님이 답을 주셨다.

Unsigned.java

package com.ronsoft.books.nio.buffers;
import java.nio.ByteBuffer;

/**
 * Utility class to get and put unsigned values to a ByteBuffer object.
 * All methods here are static and take a ByteBuffer object argument.
 * Since java does not provide unsigned primitive types, each unsigned
 * value read from the buffer is promoted up to the next bigger primitive
 * data type.  getUnsignedByte() returns a short, getUnsignedShort() returns
 * an int and getUnsignedInt() returns a long.  There is no getUnsignedLong()
 * since there is no primitive type to hold the value returned.  If needed,
 * methods returning BigInteger could be implemented.
 * Likewise, the put methods take a value larger than the type they will
 * be assigning.  putUnsignedByte takes a short argument, etc.
 *
 * @author Ron Hitchens (ron@ronsoft.com)
 * @version $Id: Unsigned.java,v 1.1 2002/02/12 22:06:44 ron Exp $
 */
public class Unsigned {
   public static short getUnsignedByte (ByteBuffer bb){
      return ((short)(bb.get() & 0xff));
   }

   public static void putUnsignedByte (ByteBuffer bb, int value){
      bb.put ((byte)(value & 0xff));
   }

   public static short getUnsignedByte (ByteBuffer bb, int position){
      return ((short)(bb.get (position) & (short)0xff));
   }

   public static void putUnsignedByte (ByteBuffer bb, int position,int value){
      bb.put (position, (byte)(value & 0xff));
   }

   // —————————————————————

   public static int getUnsignedShort (ByteBuffer bb){
      return (bb.getShort() & 0xffff);
   }

   public static void putUnsignedShort (ByteBuffer bb, int value){
      bb.putShort ((short)(value & 0xffff));
   }

   public static int getUnsignedShort (ByteBuffer bb, int position){
      return (bb.getShort (position) & 0xffff);
   }

   public static void putUnsignedShort (ByteBuffer bb, int position, int value){
      bb.putShort (position, (short)(value & 0xffff));
   }

   // —————————————————————

   public static long getUnsignedInt (ByteBuffer bb){
      return ((long)bb.getInt() & 0xffffffffL);
   }

   public static void putUnsignedInt (ByteBuffer bb, long value){
      bb.putInt ((int)(value & 0xffffffffL));
   }

   public static long getUnsignedInt (ByteBuffer bb, int position){
      return ((long)bb.getInt (position) & 0xffffffffL);
   }

   public static void putUnsignedInt (ByteBuffer bb, int position, long value){
      bb.putInt (position, (int)(value & 0xffffffffL));
   }

   // —————————————————

   public static void main (String [] argv) throws Exception {
      ByteBuffer buffer = ByteBuffer.allocate (20);

      buffer.clear();
      Unsigned.putUnsignedByte (buffer, 255);
      Unsigned.putUnsignedByte (buffer, 128);
      Unsigned.putUnsignedShort (buffer, 0xcafe);
      Unsigned.putUnsignedInt (buffer, 0xcafebabe);

      for (int i = 0; i < 8; i++) {
         System.out.println ("" + i + ": "
            + Integer.toHexString ((int)getUnsignedByte (buffer, i)));
      }

      System.out.println ("2: " + Integer.toHexString (getUnsignedShort (buffer, 2)));
      System.out.println ("4: " + Long.toHexString (getUnsignedInt (buffer, 4)));
   }
}

* Reference
http://www.javafaq.nu/java-example-code-342.html