2015-01-05 3 views
0

문제가 발생하여 인터넷에서 솔루션을 찾으려고 시도했지만 정확하거나 유사한 솔루션을 얻을 수 없습니다. 소켓에서 데이터 패킷을받는 문제는 (물론, 바이트 []로 읽혀질 것입니다.) 이제이 패킷을 파싱하고 싶습니다. 처음 2 바이트는 정수 (타입)이고, 다음 2 바이트는 다시 정수 (페이로드 길이)이며 32 바이트의 페이로드 데이터와 다음 4 바이트는 CRC입니다. 문제는 데이터 패킷을 구문 분석하는 올바른 방법을 얻을 수 없기 때문에 유형, 페이로드 길이를 얻을 수 있습니다. 올바른 형식으로 바이트를 읽는 방법을 알게되면 페이로드 데이터도 읽을 수 있습니다. 그래서 누구나 byte []를 올바른 타입으로 읽는 법을 제안 할 수 있습니다. 미리 감사드립니다. (부분) 페이로드패킷의 자바 바이트 구문 분석

패킷 데이터 포맷 -

렌 유형

2B 부호 짧은
2B 부호 짧은
2B 부호 짧은
2B 부호 짧은
2B 부호 짧은
4B 서명 긴
4B 부호있는 긴
4B 부호있는 긴
4B 부호있는 긴

+2

데이터 형식이나 인코딩에 따라 다릅니다. 예를 들어 XDR 또는 다른 인코딩입니까? 이것은 더 많은 정보 없이는 정말로 답할 수 없습니다. BTW : 페이로드가 32 바이트 인 경우 왜 페이로드 길이가 있습니까? –

+0

@Mark : 페이로드는 가변 길이 일 수 있으므로 페이로드의 길이를 나타내는 필드가 있습니다. 그러나 그것이 장애물이되어서는 안됩니다. 바이트 순서는 빅 엔디안입니다. – Reader

+0

@ug_ 추가 정보가 있으면 답을 취소 취소 하시길 바랍니다 –

답변

0

DataInputStream을 사용할 수 있습니다. 그러나 각 방법을 사용할 때주의 깊게 검사해야합니다. Java 정수에서 4 바이트, 반바지는 2입니다. 따라서 메소드가 2 바이트를 정수로 읽는다면 그 메소드는 readShort()이 될 것입니다. 그런 다음이를 정수로 형변환 할 수 있습니다. 바이트 순서는 빅 엔디안과 패딩이없는 경우

byte [] buffer = new byte[1024]; 
// populate your buffer 

// you could also remove ByteArrayInputStream with the actual input stream. 
DataInputStream in = new DataInputStream(new ByteArrayInputStream(buffer)); 
int theInteger = (int)in.readShort(); // reads 2 bytes from the stream and 
             // converts them to an integer 
+0

'int' 로의 캐스팅은 여기서 중복됩니다. – EJP

1

, 당신은 DataInputStream의 원시적 인 독서 방법을 사용할 수 있습니다 readShort()을 유형에 대해; 길이가 다른 readShort(); 페이로드에 대해서는 readFully(); CRC에 대해서는 readInt()입니다.

+0

어떻게이 바이트를 구문 분석 할 수 있습니다. 초기 2 바이트는 int 값을 형성합니다. 일부 코드 예제를 제공 할 수 있습니까? – Reader

+1

@Reader readShort()를 사용하면 정확히 2 바이트를 하나의 16 비트 단락으로 읽습니다. – eckes

+0

@Reader 정확히 무엇을 해야할지 말씀 드렸습니다. 필자는 유능한 프로그래머가이 응답을 작업 코드로 줄일 수 있기를 기대합니다. – EJP

1

ByteBuffer은 DataInputStream과 유사하게 사용할 수 있습니다. 바이트 순서도 지정할 수 있습니다.

// if you do not use NIO to read from socket, wrap a byte array: 
ByteBuffer bb = ByteBuffer.wrap(bytes); 
bb.order(ByteOrder.BIG_ENDIAN); 
short short1 = bb.getShort(); 
short short2 = bb.getShort(); 
long long1 = bb.getLong(); 
+0

형식 설명을 이해하려고 시도하지 않았습니다. 테이블로 지정하면 읽기 쉽습니다. 하지만 코드 샘플은 기본 패턴을 이해하는 데 충분해야한다고 생각합니다. 자바에는 부호없는 타입이 없기 때문에 서명 된 타입을 읽는 데 사용하고 서명되지 않은 타입으로 처리해야합니다 (또는 더 큰 타입으로 마스크). – eckes