Search

'리틀엔디안'에 해당되는 글 2건

  1. 2007.01.24 Swap16IfLE() 매크로
  2. 2007.01.23 자바 기본 유형의 바이트 순서 변환

Swap16IfLE() 매크로

Projects/CoVNC 2007.01.24 22:23 Posted by soulfree >동네청년<
참고 바람 ..

#define Swap16IfLE(s) \
   ((CARD16) ((((s) & 0xff) << 8) | (((s) >> 8) & 0xff)))

#define Swap32IfLE(l) \
   ((CARD32) ((((l) & 0xff000000) >> 24) | \
    (((l) & 0x00ff0000) >> 8)  | \
  (((l) & 0x0000ff00) << 8)  | \
  (((l) & 0x000000ff) << 24)))




jdlee12 작성:

> big,little endian 은 워드를 저장할때 바이트 앞뒤 순서가 바뀌는 거죠 ..
>
> 다른 OS 와 endian 방식이 다르면
> 매크로로 만들면 1 줄정도 이내로 swap macro 를 만들 수 있읍니다.
>
> "조우현" 작성:
>
> > 안녕하세요.
> > 전 네트워크프로그래밍을 하는데 도움이 필요해서 글을 올립니다.
> > MFC로 만들고 잇는데 다른 시스템의 서버에 client로서 연결하고
> > 또다른 MFC로 만든 클라이언트 프로그램에 대해서는 server로
> > 동작하게하는 말하자만 클라이언트와 서버의 기능을 둘다 가진
> > 프로그램이지요 . 근데 문제가 있습니다. 이 프로그램이 클라이언트로서 서버에
> > 연결할려는 시스템은 windows가 아닌 다른 OS이기때문인데 책을 보면 mfc가 아닌
> > 프로그램에서는 CSocket클래스를 사용할수 없고 big-endian에 맞추어서 데이타를
> > 보내야 한다고 합니다. 정말로 이런 방법 밖에 없나요?
> > 음..제 질문이 너무 복잡한가요?
> > 도움 부탁합니다.
신고

'Projects > CoVNC' 카테고리의 다른 글

CF_BITMAP 사용하기  (0) 2007.01.30
클립보드에서 이미지 읽기  (0) 2007.01.25
Swap16IfLE() 매크로  (0) 2007.01.24
자바 이미지 저장  (0) 2007.01.24
자바 드래그엔 드랍, 클립보드 튜토리얼  (0) 2007.01.23
Cut & Paste 자바 클립보드 - 최종명  (0) 2007.01.23

자바 기본 유형의 바이트 순서 변환

Projects/CoVNC 2007.01.23 13:44 Posted by soulfree >동네청년<

자바 기본 유형의 바이트 순서 변환
author : Yoon Kyung Koo(yoonforh@moon.daewoo.co.kr)
Copyright (c) 1999 Yoon Kyung Koo, All rights reserved.

LITTLE ENDIAN은 LSB가 처음에 나오고
BIG ENDIAN은 MSB가 처음에 나옵니다.
그리고 네트웍 바이트 순서는 BIG ENDIAN입니다.
만약 4바이트 (즉, 자바의 int, 32비트 기계에서 C의 int나 long)라면
Little Endian에서 1234 순서로 바이트가 배치되면
자바나 Big Endian은 4321 순서로 바이트를 해석해야 합니다.

float나 double의 경우는 시스템에 따라 좀더 복잡합니다.
하지만 IEEE 754를 따르는 경우에는 단순히 바이트 순서만 바꾸면 해석 가능합니다.
C에서
float은 보통 32비트(4바이트)이고
double은 보통 64비트(8바이트)입니다.
자바도 이에 준할 것입니다.
따라서 리틀 엔디안에서 더블을 표현할 때
12345678 바이트 순서라면
빅 엔디안에서는
87654321 바이트 순서로 해석하면 됩니다.


다음은 간단하게 자바 int를 다른 엔디안 값으로 바꿔보는 것입니다.


// htonl.java

class htonl {

       public static void main(String args[]) {

               if (args.length<1) {

                       System.out.println("Usage:htonl number");

                       System.exit(0);

               }

               int value=Integer.parseInt(args[0]);

               // all java integer is BIG-ENDIAN(network byte-order)

               byte[] bytes=new byte[4];

               bytes[0]=(byte)((value&0xFF000000)>>24);

               bytes[1]=(byte)((value&0x00FF0000)>>16);

               bytes[2]=(byte)((value&0x0000FF00)>>8);

               bytes[3]=(byte) (value&0x000000FF);

               int newValue = 0;

               newValue |= (((int)bytes[3])<<24)&0xFF000000;

               newValue |= (((int)bytes[2])<<16)&0xFF0000;

               newValue |= (((int)bytes[1])<<8)&0xFF00;

               newValue |= (((int)bytes[0]))&0xFF;

               System.out.println("big endian value="+value+" ("+bytes[0]+","+bytes[1]+","+bytes[2]+","+bytes[3]+")");

               System.out.println("little endian value="+newValue+" ("+bytes[3]+","+bytes[2]+","+bytes[1]+","+bytes[0]+")");

       }

}


신고