구글링을 해서 소스코드를 검색하다 보면 StackOverflow 사이트에 괜찮은 내용이 꽤나 많다.

레퍼런스를 보는 것도 괜찮지만, 아무래도 사용자들의 의견이 오간 곳이기도 하니 질도 좋고 평가도 되어있다.


// 14dp를 픽셀 단위로 변환, 14에는 원하는 dp를 넣으면 됨.
Resources r = getResources();
float px = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 14, r.getDisplayMetrics());


다른 방법은

/**
 * This method convets dp unit to equivalent device specific value in pixels. 
 * 
 * @param dp A value in dp(Device independent pixels) unit. Which we need to convert into pixels
 * @param context Context to get resources and device specific display metrics
 * @return A float value to represent Pixels equivalent to dp according to device
 */
public static float convertDpToPixel(float dp,Context context){
    Resources resources = context.getResources();
    DisplayMetrics metrics = resources.getDisplayMetrics();
    float px = dp * (metrics.densityDpi/160f);
    return px;
}
/**
 * This method converts device specific pixels to device independent pixels.
 * 
 * @param px A value in px (pixels) unit. Which we need to convert into db
 * @param context Context to get resources and device specific display metrics
 * @return A float value to represent db equivalent to px value
 */
public static float convertPixelsToDp(float px,Context context){
    Resources resources = context.getResources();
    DisplayMetrics metrics = resources.getDisplayMetrics();
    float dp = px / (metrics.densityDpi / 160f);
    return dp;

}


어느 블로그에서 필터링 없이 사용했는데 동작하지 않던 소스..

private static final float DEFAULT_HDIP_DENSITY_SCALE = 1.5f;

	/**
	 * 픽셀단위를 현재 디스플레이 화면에 비례한 크기로 반환합니다.
	 * 
	 * @param pixel
	 *            픽셀
	 * @return 변환된 값 (DP)
	 */
	public int DPFromPixel(int pixel) {
		float scale = getResources().getDisplayMetrics().density;

		return (int) (pixel / DEFAULT_HDIP_DENSITY_SCALE * scale);
	}

	/**
	 * 현재 디스플레이 화면에 비례한 DP단위를 픽셀 크기로 반환합니다.
	 * 
	 * @param DP
	 *            픽셀
	 * @return 변환된 값 (pixel)
	 */
	public int pixelFromDP(int DP) {
		float scale = getResources().getDisplayMetrics().density;

		return (int) (DP / scale * DEFAULT_HDIP_DENSITY_SCALE);
	}


자주 보게 되는 예외를 정리해 봤습니다. 이유 모를 예외나 모르는 예외가 있을 때 댓글로 달아주세요.


1. NullPointerException
Null 객체에 대해 접근했을 때 발생한다.
ex) String str = null;
str.equals("foo");


2. IllegalArgumentException
잘못된 인자값을 전달했을때 발생한다.


3. ArithmeticException
산술적인 오류가 있을 때 발생한다.
ex) int i = 1 / 0; // 0으로 나눌 수 없으므로 예외 발생.


4. ClassCastException
잘못된 형변환을 할 때 발생한다.
ex) Object o = "foo";
char[] str = (char[]) o;


'밤을 지새다 > Java' 카테고리의 다른 글

Java StAX: XMLInputFactory  (0) 2012.04.30
Java StAX  (0) 2012.04.30
자바. 얼마나 알고 사용하고 계신가요?  (0) 2011.08.25
객체를 바이트 배열로, 바이트 배열을 객체로  (0) 2011.08.22
메서드 체인화 기법  (0) 2011.08.17
1. JDK 설치
자바개발을 위해서는 JDK를 설치해야합니다.
JDK는 Java Development Kit의 약자로 뜻 그대로 자바 개발 도구입니다. JDK에는 개발을 위한 컴파일러나 인터프리터가 포함되어있습니다. JRE라는 것도 들어보셨을건데 JRE는 자바로 작성한 프로그램을 실행하기 위한 환경으로 Java Runtime Environment의 약자입니다.

소개는 간단히 하고 JDK를 설치해 봅시다. java는 오라클에서 배포하고 있고 사용은 무료입니다.

☞ 다운로드 링크

다운로드 링크를 따라가시면 아래와 같이 나올텐데요, SE버전 링크를 걸어두었습니다. SE는 Standartd Edition이구요. 자바 표준 버전입니다. 기본적인 자바개발을 위한 라이브러리가 포함되어 있습니다. 여러가지 버전이 있는데 그중에 EE버전은 Enterprise Edition으로 웹 애플리케이션 서버 개발시 주로 이용합니다.
라이선스에 동의해 주시면 바로 다운로드 받을 수 있습니다. 
자신의 운영체제에 맞는 버전을 받으시면 됩니다.



JDK 설치파일 실행 모습입니다. 환영한다네요!
 
 

기본 설치 옵션입니다. JDK를 설치하면 JRE도 함께 설치가 됩니다.
데모, 샘플을 이용해 공부할 생각이 있으시다면 Demos and Samples를 클릭하셔서 Install를 선택하시면 됩니다.
설치 경로는 디폴트로 Program files아래에 java 폴더로 설치가 됩니다. 그 아래에 버전별로 구분이 되구요
윈도우 7에서 32bit를 사용하실 경우 Program Files(x86) 폴더에 설치가 됩니다.
바꾸셔도 상관은 없습니다. 다만 환경변수(PATH)설치할 때 지정해준 경로로 잡아주시면 됩니다.
 
 

JDK는 이렇게 설치가 되구요. 사양에 따라서 1분 내외로 설치가 완료됩니다.
 
 

다음은 JRE를 설치합니다. 저는 JRE도 디폴트 경로에 설치했습니다.
 

큼지막하게 자바 자랑하고 있네요. 30십억의 장치에서 자바를 쓰고 있답니다.
오라클이 선마이크로시스템즈를 인수하고는 이제 오라클 로고가 딱!
 

완료 되었습니다. [Product Registration Information] 버튼은 제품 등록에 관한 정보를 확인할 수 있는 페이지입니다.
가볍게 [Finish] 버튼을 눌러 설치를 완료합니다.

 

2. 환경변수 설정
환경변수는 콘솔(커맨드)환경에서 자바 컴파일러나 인터프리터를 실행할 시에 실행파일의 전체 경로를 쓰지 않아도 되게끔 해주는 변수입니다.
현재있는 경로에서 어떤 명령어를 실행했을 때 그 경로에 해당 파일이 존재하지 않는다면 환경변수의 경로들을 하나씩 검사하여 그 안에 있으면 실행한다는 얘기입니다.
즉 컴파일을 위해서 C:\Program Files\java\jdk 1.6.02\bin\javac Hello.java 이렇게 다 치지 않고 어디서든 소스 파일이 있는 곳에서 javac hello.java 이렇게 하시면 됩니다. 


아래는 Window 7 환경 기준으로 설명했구요. XP를 쓰시는 분은 [더보기]를 클릭하셔서 시스템 속성에 들어가는 방법을 확인해 주세요.
 
 

윈도우키 + E 를 눌러 탐색기를 실행하고 좌측에 있는 컴퓨터에서 오른쪽 버튼을 눌러 속성(B)를 선택합니다.

 


시스템 설정창이 나오면 좌측에서 "고급 시스템 설정"을 클릭합니다.

 

고급 시스템 설정을 누르면 시스템 속성 창이 뜨는데 여기서 [고급] 탭으로 이동하셔서
[환경변수(N)...] 버튼을 눌러줍니다.


위쪽에 있는 목록은 현재 로그온된 사용자에게만 적용되는 내용이고
아래쪽에 있는 목록은 현재 시스템을 사용하는 전체에게 적용되는 내용입니다.
하나의 계정으로 쓰시는 경우에는 어느쪽이든 상관없지만 전체 사용자에게 적용하시려면
아래쪽에 있는 Path를 편집하시면 됩니다.


Path 편집을 누르면 기존에 있던 Path 값이 있습니다. 기존의 내용을 지우지 마시고 제일 끝에 가셔서
세미콜론(;, 경로를 구분하는 역할을 합니다)을 삽입하시고 JDK를 설치한 경로\bin을 입력하고 확인을 눌러주세요.
다시 시스템 속성 창으로 돌아오면 확인을 눌러 속성을 저장하고 나옵니다.


패스가 잘 저장되었는지 확인해 봅시다. 윈도우 + R 키를 눌러 실행창을 띄우고 cmd (커맨드 콘솔)을 입력하고 엔터!


콘솔창이 나타나면 java 라고 입력하고 엔터.
java 실행 시 옵션에 대한 내용이 나타나면 설정이 제대로 된겁니다.



아직 에디트 플러스나 기타 텍스트 에디터로 자바 프로그래밍을 하시는 분들도 많으시지만
아무래도 이클립스나 J빌더를 사용해서 프로그래밍을 하는 쪽에 한표를 주고 싶습니다.
"자바를 하려면 콘솔에서 자바를 컴파일하고 실행할 줄 알아야 한다"라시는 분들도 계시지만 참고 정도로 알면 된다고 생각하구요, 무얼하든 마찬가지겠지만 개발에 있어서도 환경이 잘 갖춰져 있는게 개발에 더 도움이 되지 않을까 싶습니다. 

콘솔에서 자바를 사용해보시고 싶으신 분은 "자바 콘솔 명령어" 키워드로 검색하시면 원하시는 결과를 얻을 수 있습니다.
다음 소스를 실행하면 출력 순서는 어떻게 되는지 맞춰보세요 :D

public class MyClass{

public MyClass(){

System.out.println("(가)");
}

static {
System.out.println("(나)");
}

{
System.out.println("(다)");
}

public static void main(String[] args){
System.out.println("(라)");
new MyClass();
}

'밤을 지새다 > Java' 카테고리의 다른 글

Java StAX: XMLInputFactory  (0) 2012.04.30
Java StAX  (0) 2012.04.30
Exceptions  (0) 2011.09.05
객체를 바이트 배열로, 바이트 배열을 객체로  (0) 2011.08.22
메서드 체인화 기법  (0) 2011.08.17

Object to byte array and byte array to Object in Java

원출처 : http://scr4tchp4d.blogspot.com/2008/07/object-to-byte-array-and-byte-array-to.html

Here how to convert an Object to a byte array, and vice-versa.
요기에 객체를 바이트 배열로, 그 반대로 바꾸는 방법이 있습니다!
역시 구글링이랄까.
 
public byte[] toByteArray (Object obj)
{
  byte[] bytes = null;
  ByteArrayOutputStream bos = new ByteArrayOutputStream();
  try {
    ObjectOutputStream oos = new ObjectOutputStream(bos); 
    oos.writeObject(obj);
    oos.flush(); 
    oos.close(); 
    bos.close();
    bytes = bos.toByteArray ();
  }
  catch (IOException ex) {
    //TODO: Handle the exception
  }
  return bytes;
}
    
public Object toObject (byte[] bytes)
{
  Object obj = null;
  try {
    ByteArrayInputStream bis = new ByteArrayInputStream (bytes);
    ObjectInputStream ois = new ObjectInputStream (bis);
    obj = ois.readObject();
  }
  catch (IOException ex) {
    //TODO: Handle the exception
  }
  catch (ClassNotFoundException ex) {
    //TODO: Handle the exception
  }
  return obj;
}

'밤을 지새다 > Java' 카테고리의 다른 글

Java StAX: XMLInputFactory  (0) 2012.04.30
Java StAX  (0) 2012.04.30
Exceptions  (0) 2011.09.05
자바. 얼마나 알고 사용하고 계신가요?  (0) 2011.08.25
메서드 체인화 기법  (0) 2011.08.17
자바 개발 환경 구축
SDK 설치
ADT 설치
안드로이드 NFC 예제를 보면서 괜찮은 기법이 있어서 소개할까합니다. (저만 몰랐던 걸 수도 있구요. :D ) 

제가 본 소스의 일부를 쓰자면

BiMap<Byte, String> URI_PREFIX = BiMap.<Byte, String>builder()
            .put((byte) 0x00, "")
            .put((byte) 0x01, "http://www.")
            .put((byte) 0x02, "https://www.")
            .put((byte) 0x03, "http://")
            .put((byte) 0x04, "https://")
            .put((byte) 0x05, "tel:")
            .build();



맵에 요소를 넣으면서 URI_PREFIX에 인스턴스를 할당하는 구문입니다. 

처음 봤을 때는 저게 원래 자바에서 지원하는 문법인가 싶어서  객체 안에 있는 메서드
위처럼 세미콜론 없이 닷만 찍어서 계속 해보려했는데 당연히도 에러가 나더군요. 

위 문장을 보고 저게 뭐? 라고 생각하셨다면 아래에 쓰는 체이닝 기법을 적용하지 않고 작성한 소스를 보고 비교해보세요.

BiMap<Byte, String> URI_PREFIX =
BiMap.<Byte, String>builder().build(); 
URI_PREFIX.put((byte) 0x00, "");
URI_PREFIX.put((byte) 0x01, "http://www.");
URI_PREFIX.put((byte) 0x02, "https://www.");
URI_PREFIX.put((byte) 0x03, "http://");
URI_PREFIX.put((byte) 0x04, "https://");
URI_PREFIX.put((byte) 0x05, "tel:"); 


개인적인 차이일지도 모르겠지만 저는 체이닝 기법을 적용한 소스가 더 깔끔하고 직관적으로 느껴지네요. 서론은 여기까지 하고 실제로 어떻게 체이닝 기법을 적용할 수 있는지 예제를 만들면서 알아봅시다.

만들 클래스는 간단한 학생 정보 클래스입니다. 체이닝 기법을 적용한다고 해서 그리 효율적인 클래스가 되진 않겠지만 간단한 예를 위해서 이 클래스를 씁니다.

/** 학생정보 클래스 */
class Student{
private String name; // 학생이름
private String number; // 학번
private int birthyear; // 생년
private String dept; // 학과 

public void setName(String name){
this.name = name;
}

public void setNumber(String number){
this.number = number;
}

public void setBirthyear(int birthyear){
this.age = age;
}

public void setDept(String dept){
this.dept = dept;
}

/* getter 생략 */ 
}



위 클래스에서 생성자를 두지 않는다고 가정하면 학생 인스턴스에 정보를 넣기위해서는 아래와 같이 코드를 작성하게 되겠죠

Student student = new Student();
student.setName("세종대왕");
student.setNumber("7284910");
student.setBirthyear(1397);
student.setDept("국어국문학과");



체이닝 기법을 적용하기 위해서 뮤테이터(세터) 메서드의 반환형을 void에서 오브젝트를 반환하도록 Student 타입으로 바꿔 줍니다.
그리고 메서드 구현부의 끝에 return this;를 써서 객체를 반환하도록 하구요.
DSL에서는 setName과 같은 메서드 이름도 더 직관적으로 바꾸지만 익숙함을 위해서 그대로 쓰도록 하겠습니다. 위의 Student 클래스를 체이닝 기법을 적용하기 위한 소스로 바꿔보면 아래와 같습니다. 빨간색 글씨가 수정된 부분입니다

/** 학생정보 클래스 */
class Student{
private String name; // 학생이름
private String number; // 학번
private int birthyear; // 생년
private String dept; // 학과 

public Student setName(String name){
this.name = name;
return this;
}

public Student setNumber(String number){
this.number = number;
return this;
}

public Student setBirthyear(int birthyear){
this.age = age;
return this;
}

public Student setDept(String dept){
this.dept = dept;
return this;
}

/* getter 생략 */ 
}



클래스를 바꿨으니 인스턴스를 할당할 때도 바로 적용해 봅시다.

Student student = new Student()
.setName("세종대왕")
.setNumber("7284910")
.setBirthyear(1397)
.setDept("국어국문학과");



네. 이상입니다.
원리는 간단합니다. 계속해서 객체를 반환하니 메서드를 다시 호출해서 쓸 수 있고. 역시 student 변수는 Student 클래스 타입이니 반환한 객체 그대로 받을 수 있게 됩니다.  

'밤을 지새다 > Java' 카테고리의 다른 글

Java StAX: XMLInputFactory  (0) 2012.04.30
Java StAX  (0) 2012.04.30
Exceptions  (0) 2011.09.05
자바. 얼마나 알고 사용하고 계신가요?  (0) 2011.08.25
객체를 바이트 배열로, 바이트 배열을 객체로  (0) 2011.08.22
NDEF 레코드에서 Text 레코드 타입의 정의입니다. 즉 NDEF Record가 Text 일때의 포맷입니다.

NDEF Message에 관한 전반적인 내용은 아래 링크된 글에서 참조 하시기 바랍니다.
NFC Data Exchange Format

1. NDEF Text Record
PAYLOAD의 레이아웃입니다. 표에서의 각 한칸은 1bit를 의미합니다.
7 6 5 4 3 2 1 0
UTF RFU Language code length
Language code (US-ASCII)
Actual text body

1) UTF - Text encoding
UTF 필드는 실제 텍스트 정보의 인코딩입니다.
UTF 값이 0이면 UTF-8 인코딩, 1인 경우 UTF-16 입니다.

2) RFU
RFU 필드는 Reserver for Future Use의 준말로써 아직 사용하지 않는 필드이며 예약된 필드 영역입니다. 이 값은 현재는 무조건 0으로 주시면 됩니다.

3) Language Code Length
텍스트 정보의 언어 코드 정보를 표현하는 필드의 길이입니다.
이 필드의 값에 따라 2번째 바이트에 위치한 Language Code 필드의 바이트 수가 정해집니다. Language code length의 값이 3 (2진수 000011) 인 경우 아래쪽 Language code 의 바이트 수(비트가 아닙니다 - 표에서의 한줄이 1byte 입니다.)는 3개가 되겠죠. 아래쪽에서 예제로 다시 설명하겠습니다.

4) Language code
텍스트 정보의 언어 코드 정보입니다. RFC 3066에 IATA의 형식으로 표기하시면 되고 인코딩은 US-ASCII입니다.
RFC 3066의 정보를 깔끔하게 정리해놓은 사이트가 있어 링크 걸어둡니다.
Using Language Identifier

5) Actual text body
실제 텍스트 정보가 들어가는 부분입니다. 텍스트의 길이에 따라서 복수의 byte를 가질 수 있습니다.



2. 간단한 예제
"안녕하세요 NFC 텍스트 레코드입니다." 라는 정보를 담는 텍스트 레코드를 만들어보는 예제입니다. NDEF Message의 헤더부분은 따로 쓰지 않겠습니다.

UTF-8로 인코딩하고 IATA 언어 코드는 "ko-KR"입니다.
따라서 UTF 필드는 0

RFU필드는 자동적으로 0 (사용하지 않는 필드이므로)

언어 코드의 길이(Language code length)는 ko-KR 이므로 십진수로 5이고 이진수로는 여섯 비트에 걸쳐 0 0 0 1 0 1 입니다.

언어코드는 "ko-KR"(한글)을 사용하므로 이를 아스키값으로 표현하면
0x6b,  0x6f,  0x2d,  0x4b,  0x52 입니다. 즉 표에서보면 5줄로 표현되며 각 줄에 위의 값이 표시됩니다.

실제 텍스트 부분입니다. UTF-8로 인코딩하여 byte값을 얻어보면
0xec  0x95  0x88  0xeb  0x85 
0x95  0xed  0x95  0x98  0xec 
0x84  0xb8  0xec  0x9a  0x94 
0x20  0x4e  0x46  0x43  0x20 
0xed  0x85  0x8d  0xec  0x8a 
0xa4  0xed  0x8a  0xb8  0x20 
0xeb  0xa0  0x88  0xec  0xbd 
0x94  0xeb  0x93  0x9c  0xec 
0x9e  0x85  0xeb  0x8b  0x88 
0xeb  0x8b  0xa4  0x2e
네.. 좀 기네요 길이는 49입니다. 그럼 Actual text body는 총 49바이트 (표에서 49줄)의 정보를 가지게 되고 각 줄에 위의 바이트 값들을 가지게 되겠죠

여기서 혹시나 알아채신 분이 있다면 실제 텍스트의 길이는 어떻게 구하느냐 인데. 이 글에서 표현하는 정보는 Payload에 국한되어있습니다. Payload의 길이는 자기자신이 가진게 아니라 Message에서 가지고 있으므로 Message에서 가진 Payload의 길이에서 Actual text body 부분을 제외한 바이트 수를 빼면 Actual text body의 길이가 됩니다.

[결과]
7 6 5 4 3 2 1 0
0 0 0 0 0 1 0 1
Language code (US-ASCII encoding ) : "ko-KR" to bytes
0x6
0x6f
0x2d
0x4b
0x52
Actual text body contents : "안녕하세요 NFC 텍스트 레코드입니다." to bytes
0xec
0x95
0x88
0xeb
0x85
0x95
0xed
0x95
0x98
0xec
0x84
0xb8
0xec
0x9a
0x94
0x20
0x4e
0x46
0x43
0x20
0xed
0x85
0x8d
0xec
0x8a
0xa4
0xed
0x8a
0xb8
0x20
0xeb
0xa0
0x88
0xec
0xbd
0x94
0xeb
0x93
0x9c
0xec
0x9e
0x85
0xeb
0x8b
0x88
0xeb
0x8b
0xa4
0x2e



[참고자료]
NFC Forum Text Record Type Definition
세부사항 미작성

대략적인 메커니즘

1. NFC 디바이스를 사용하기 위해서 퍼미션을 추가한다.

2. NFC 메시지를 처리할 액티비티에 intent-filter 추가

3. 액티비티로 돌아가서 Parcelabel Extra를 얻는다

4. Parcelable 배열이 null이거나 길이가 0일경우 빈 레코드 처리

5. 그렇지 않은 경우 Ndef 배열로 변환

6. NDEF Message 파싱

7. NDEF Message to NDEF Records

8. NDEF Records to byte array

9. NDEF Record 포맷에 맞춰 byte array 파싱

10. 원하는 포맷인지 체크하고 그에 따라 처리.



최종 작성 11.08.16. AM 5:00
- Message나 Record의 포맷부터 정확히 알아야 식별자를 만들 수 있을 듯 하다..
[참고 자료]
Android example NFC Test
우선 NDEF 를 간략하게 정의하면 디바이스와 태그를 위한 공용 포맷이다. 원문을 다 해석하긴 무리이기도 하고 해석해서 한글로 써놨는데 의미를 모를 것 같기도 해서 중요한 내용만 옮깁니다. 

1. 용어
NDEF application - 응용, 애플리케이션
NDEF를 사용하는 NFC 포럼의 장비의 논리적인 상위 계층에서의 응용
NDEF message - 메시지
이 스펙에서 정의되어 만들어진 기본적인 메시지, 하나의 NDEF 메시지는 하나 또는 이상의 NDEF 레코드를 포함한다.
NDEF record - 레코드
NDEF record는 타입, 길이, 선택적인 식별자에 관한 정보를 가지고 있는 payload를 포함하고 있다.
NDEF short record - 숏 레코드
SR 플래그가 1로 설정된 NDEF record. short record 내의 PAYLOAD_LENGTH 필드는 single octet이 적재되거나 255byte 이상 적재되도록 묶을 수 있게 한다.? (single octet은 8bit? byte? 8진수? 아예 상관자체가 없는건가..?)
NDEF record chunk - 레코드 묶음
꽉찬 payload보다 payload의 묶음을 포함한 NDEF record, 각각의 record chunk는 묶인 payload의 부분을 전달한다. 예외적으로 각각의 묶인 페이로드의 마지막 레코드는 CF 플래그가 1로 설정되어 있다.
NDEF payload - 페이로드
전달된 NDEF 레코드에 있는 응용 데이터
NDEF chunked payload
CF 플래그가 1인 마지막 레코드를 제외한 레코드들에서 각각의 분리된 NDEF 레코드에서 전달된 부분적인 다중 묶음들을 가진 응용 데이터
NDEF payload length
단일 NDEF 레코드의 페이로드에서 octet의 수를 가리키는 수
NDEF payload type
페이로드의 타입을 가리키는 식별자.  이 상세에서는 URI도 지원한다 또한 NFC 상세 레코드 타입 식별자에서도 지원한다.
NDEF payload identifier
페이로드를 식별하기 위해 사용할 수 있는 선택적인 URI
NDEF generator
애플리케이션에서 정의된 NDEF 메시지의 페이로드를 캡슐화하는 개체나 모듈
NDEF parser
NDEF 애플리케이션에 상관없이 페이로드나 NDEF 메시지를 분석하는 개체나 모듈
User Application
NDEF를 사용하는 응용 = NDEF Application



NDEF Encapsulation Constructs
Message(메시지)
NDEF 메시지는  하나 이상의 NDEF 레코드로 구성되어있다. 첫번째 레코드는 MB(Message Begin)라고 표기하고 마지막 레코드는 ME(Message End)라고 쓴다.  최소 메시지 길이는 하나의 NDEF 레코드인데 이때는 MB와 ME가 같은 레코드에 들어간다. 달리 말하자면 페이로드 묶음을 인코드하기 위해서는 적어도 둘 이상의 레코드 묶음이 필요하다는 얘기다.  
NDEF 메시지에 전달될 수 있는 NDEF 레코드의 최대 수는 제한이 없다.
NDEF 메시지는 중첩되지 않는다. 이것은 MB나 ME 플래그가 NDEF 메시지와 중첩되지 않는다는 것을 뜻한다. NDEF 메시지는 레코드의 페이로드로 꽉찬 메시지 인 경우에는 중첩될 수도 있다.

 NDEF Message
R1 MB=1  ...  Rr  ...  Rs  ... Rt ME=1 
[레코드 집합과 NDEF 메시지의 예]



Octet 1
Octet 2 Octet 3
Octet 4  
Octet 5  
[NDEF Octet Ordering]


7 6 5 4 3 2 1 0
MB  ME  CF  SR  IL  TNF
 TYPE LENGTH
 PAYLOAD LENGTH 3
 PAYLOAD LENGTH 2
 PAYLOAD LENGTH 1
 PAYLOAD LENGTH 0
 ID LENGTH
 TYPE
 ID
 PAYLOAD
[NDEF Record Layout]


7 6 5 4 3 2 1 0
MB  ME  CF  1 IL  TNF
 TYPE LENGTH
 PAYLOAD LENGTH
 ID LENGTH
 TYPE
 ID
 PAYLOAD
[NDEF Short-Record Layout (SR=1)]

SR = Shorted Record
IL = ID Length
TNF = Type Name Format
 Type Name Format Value 
 Empty  0x00 
 NFC Forum well-known type [NFC RTD]  0x01
 Media-type as defined in RFC 2046 [RFC 2046]  0x02
 Absolute URI as defined in RFC 3986[RFC 3986]  0x03
 NFC Forum external type [NFC RTD]  0x04
 Unknown  0x05
 Unchanged  0x06
 Reserved  0x07
 

(설명으로 봐서는 필드 한칸이 1bit 인것 같다. 고로 single octet은 1bit 란 얘긴데.. octet은 8을 뜻하는..?? 엉?? 바이튼가? 뭐지??)
single octet = 1 byte... 구글링 : octet equals to byte?



영어 독해 능력이 절실하다.. 쓰면서도 무슨 말인지 모르겠어......... ㅠㅠ

최종 수정일 11. 8. 14

[참고 자료]
1. NFC Data Exchange Format Specification, NFC Forum 2006
2. NFC Record Type Definition (RTD) Specification", NFC Forum 2006 

+ Recent posts