C + + / 자바 간 Socket 통신 크기 단 주의사항

3767 단어
하나의 사물 연결 프로젝트 에서 자바 클 라 우 드 플랫폼 과 하나의 클 라 이언 트 가 socket 맞 춤 형 프로 토 콜 을 하 는 통신 이 필요 합 니 다.그러나 첫 번 째 테스트 에 서 는 예상대로 해석 이 이 뤄 지지 않 았 다.자 료 를 찾 은 후 클 라 이언 트 의 데이터 읽 기 방식 이 작은 엔 드 모드 이 고 자바 는 기본적으로 큰 엔 드 모드 를 사용 합 니 다.
    컴퓨터 시스템 에서 우 리 는 바이트 단위 로 모든 주소 단원 은 하나의 바이트 에 대응 하고 하나의 바이트 는 8bit 이다.그러나 C 언어 에는 8bit 의 char 를 제외 하고 16bit 의 short 형, 32bit 의 log 형 (구체 적 인 컴 파일 러 를 봐 야 한다) 도 있다. 또한 8 비트 이상 의 프로세서, 예 를 들 어 16 비트 또는 32 비트 의 프로세서 에 대해 레지스터 너비 가 한 바이트 이상 이기 때문에 여러 바이트 를 어떻게 배치 하 는 지 에 문제 가 존재 할 것 이다.그래서 대형 저장 모드 와 작은 저장 모드 를 초래 했다.
     현재 Intel 의 80x 86 시리즈 칩 은 유일 하 게 작은 엔 드 를 꾸준히 사용 하고 있 으 며, MIPS 와 ARM 등 칩 은 모든 엔 드 방식 으로 저장 하거나 큰 엔 드 를 지원 하 는 옵션 을 제공 합 니 다. 크기 에서 전환 할 수 있 습 니 다.또한 대소 단 에 대한 처리 도 컴 파 일 러 의 실현 과 관련 이 있다. C 언어 에서 기본 값 은 작은 단 (그러나 일부 단편 기 에 대한 실현 은 큰 단, 예 를 들 어 Keil 51C) 을 바탕 으로 하고 자 바 는 플랫폼 과 무관 하 며 기본 값 은 큰 단 이다.네트워크 에서 데 이 터 를 전송 하 는 데 보편적으로 사용 되 는 것 은 모두 대단 하 다.
     대 단 과 소 단 간 의 통신 을 만나면대소 단의 데이터 읽 기 원리 에 따라 상응하는 변환 을 해 야 한다.(자바 의 엔 드 모드 를 예 로 들 면)
    현재 자바 의 32 비트 int 형 데 이 터 를 예 로 들 어 변환 예제 를 만 듭 니 다.
    다음 과 같 습 니 다. 큰 끝 int 를 작은 끝 으로 바 꾸 는 byte 배열 입 니 다. int 형의 4 개의 높 은 비트 16 진수 역 서 를 바이트 배열 에 넣 습 니 다.
 public static byte[] intToMinByteArray(int i) {
        byte[] result = new byte[4];
        //      
        result[3] = (byte) ((i >> 24) & 0xFF);
        result[2] = (byte) ((i >> 16) & 0xFF);
        result[1] = (byte) ((i >> 8) & 0xFF);
        result[0] = (byte) (i & 0xFF);
        return result;
    }

 
   다음은 작은 엔 드 배열 이 큰 엔 드 int 수로 바 뀌 는 예제 입 니 다. 문자열 로 표 시 된 16 진수 로 Integer 의 api 로 바 꿉 니 다.
public static int byteLittleEndianToInt(byte[] bytes) {
        String nubHexStr = "";
        byte[] temp = new byte[bytes.length];
        for (int i = 0; i < bytes.length; i++) {
            System.out.println(" :" + bytes[bytes.length - i - 1]);
            System.out.println("   16   :"+Integer.toHexString(bytes[bytes.length - i - 1]));
            nubHexStr += Integer.toHexString(bytes[bytes.length - i - 1]);
        }
        System.out.println("16  :" + nubHexStr);
        return Integer.parseInt(nubHexStr, 16);
    }

이상 코드 는 Felix 에서 왔 습 니 다.
 
다음으로 전송:https://www.cnblogs.com/LingoXu/p/5235176.html

좋은 웹페이지 즐겨찾기