투케이2K

108. (java/자바) 리틀엔디안(little endian), 빅엔디안(big endian) 데이터 포맷 수행 실시 본문

Java

108. (java/자바) 리틀엔디안(little endian), 빅엔디안(big endian) 데이터 포맷 수행 실시

투케이2K 2021. 1. 10. 19:59

/* =========================== */

[ 개발 환경 설정 ]

개발 툴 : Eclipse

개발 언어 : Java

/* =========================== */

/* =========================== */

[소스 코드]

 

package AI3;

import java.util.Arrays;

public class MainActivity13 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		System.out.println("[리틀엔디안(little endian), 빅엔디안(big endian) 데이터 포맷 수행 실시]");
		
		/*[설 명]
		 * 1. 리틀 엔디안 방식은 낮은 주소(앞쪽공간)에 데이터의 하위(뒤쪽)바이트부터 저장하는 방식입니다
		 *    (0x12345678 데이터는 > 78 56 34 12 순으로 저장됩니다)
		 * 2. 빅 엔디안 방식은 낮은 주소(앞쪽공간)에 데이터의 상위(앞쪽) 바이트부터 저장하는 방식입니다
		 *    (0x12345678 데이터는 > 12 34 56 78 순으로 저장됩니다)
		 * 3. C프로그램은 리틀엔디안 방식으로 저장되며, java는 빅엔디안 방식으로 저장됩니다
		 * 4. 빅 엔디안과 리틀 엔디안은 단지 저장해야 할 큰 데이터를 어떻게 나누어 저장하는가에 따른 차이일 뿐입니다	   
		 */
		int data = 720;
		System.out.println("원본 [정수 데이터] : "+data);
		System.out.println("파싱 바이트 [정수_To_2byte] : "+Arrays.toString(getTwoLittle(data)));		
		System.out.println("파싱 바이트 [정수_To_4byte] : "+Arrays.toString(getFourLittle(data)));
		System.out.println("");
		
		byte two_Little_Arr[] = {-48, 2};
		byte four_Little_Arr[] = {-48, 2, 0, 0};
		System.out.println("원본 [2byte 데이터] : "+Arrays.toString(two_Little_Arr));
		System.out.println("원본 [4byte 데이터] : "+Arrays.toString(four_Little_Arr));
		System.out.println("파싱 [2byte_To_정수] : "+getTwoLittleToBig(two_Little_Arr));		
		System.out.println("파싱 [4byte_To_정수] : "+getFourLittleToBig(four_Little_Arr));

	}//메인 종료
	
	// ==== 정수값을 2바이트 리틀엔디안으로 데이터 포맷 수행 ====
	public static byte[] getTwoLittle(int data){
		//[2바이트 기준]
		byte[] buf = new byte[2];
		buf[0] = (byte)((data >>>  0) & 0xFF);
		buf[1] = (byte)((data >>>  8) & 0xFF);	    
		return buf;
	}
	
	// ==== 정수값을 4바이트 리틀엔디안으로 데이터 포맷 수행 ====	
	public static byte[] getFourLittle(int data){		
		//[4바이트 기준]
		byte[] buf = new byte[4];
		buf[0] = (byte)((data >>>  0) & 0xFF);
		buf[1] = (byte)((data >>>  8) & 0xFF);
		buf[2] = (byte)((data >>> 16) & 0xFF);
		buf[3] = (byte)((data >>> 24) & 0xFF);	    	    	  
		return buf;	      		 
	}
	    		
	// ==== 2바이트 리틀엔디안값을 다시 빅엔디안값으로 포맷 ====
	public static int getTwoLittleToBig(byte[] data){	   
		int[] arr = new int[2]; //2바이트 배열 공간
		for(int i=0; i<arr.length; i++){            
    	   		arr[i] = (int)(data[1-i] & 0xFF); //2바이트
		}       
		return ((arr[0]  << 8) + (arr[1]  << 0)); //2바이트
	}
    
	// ==== 4바이트 리틀엔디안값을 다시 빅엔디안값으로 포맷 ====
	public static int getFourLittleToBig(byte[] data){
		int[] arr = new int[4]; //4바이트 배열공간	   
		for(int i=0; i<arr.length; i++){
			arr[i] = (int)(data[3-i] & 0xFF); //4바이트		   
		}
		return ((arr[0]  << 24) + (arr[1]  << 16) + (arr[2]  << 8) + (arr[3]  << 0)); //4바이트	   
	}

}//클래스 종료

/* =========================== */

[결과 출력]

[리틀엔디안(little endian), 빅엔디안(big endian) 데이터 포맷 수행 실시]

원본 [정수 데이터] : 720

파싱 바이트 [정수_To_2byte] : [-48, 2]

파싱 바이트 [정수_To_4byte] : [-48, 2, 0, 0]

원본 [2byte 데이터] : [-48, 2]

원본 [4byte 데이터] : [-48, 2, 0, 0]

파싱 [2byte_To_정수] : 720

파싱 [4byte_To_정수] : 720

/* =========================== */

/* =========================== */

[요약 설명]

* 1. 리틀 엔디안 방식은 낮은 주소(앞쪽공간)에 데이터의 하위(뒤쪽)바이트부터 저장하는 방식입니다

     (0x12345678 데이터는 > 78 56 34 12 순으로 저장됩니다)

* 2. 빅 엔디안 방식은 낮은 주소(앞쪽공간)에 데이터의 상위(앞쪽) 바이트부터 저장하는 방식입니다

     (0x12345678 데이터는 > 12 34 56 78 순으로 저장됩니다)

* 3. C프로그램은 리틀엔디안 방식으로 저장되며, java는 빅엔디안 방식으로 저장됩니다

* 4. 빅 엔디안과 리틀 엔디안은 단지 저장해야 할 큰 데이터를 어떻게 나누어 저장하는가에 따른 차이일 뿐입니다

/* =========================== */

반응형
Comments