문제 : 패킷 형식의 정의가 고정 된 전자 장치에서 네트워크 입력 판독기를 구현해야합니다. 머리글, 바닥 글 및 데이터 본문이 있습니다. 패킷의 필드는 비트로 정의됩니다.
예 : 필드 sequence_number 변수는 8에서 31까지 번호가 매겨진 비트이고 ack_status는 비트 32입니다. Java 객체를 패킷에서 읽은 byte []로 (부터) 변환 할 수 있도록 사용자 정의 직렬화 함수를 어떻게 생성합니까?
32 비트 패킷
StartOfPacketHeader 4 비트
CommandCode 4 비트
시퀀스 번호 23 비트
AckStatus 1 비트
byte [] 생성자와 toBytes () 메소드를 사용하여이 객체에 대한 Java 래퍼 클래스를 만드는 방법은 무엇입니까?
직렬화 가능 인터페이스를 사용하면 개별 데이터 크기를 제어 할 수 없습니다. 데이터 크기는 3 비트 또는 18 비트 변수와 같은 홀수 값일 수 있습니다. 변수의 길이를 비트 단위로 지정할 수 없습니다.
지금까지 내가 한 일 :
소스는 실제로 부호없는 정수를 보냅니다. 즉, Java int 유형은 전체 범위를 처리 할 수 없습니다. 모든 경우를 처리하려면 모든 데이터 유형을 정의해야합니다. BitSet 클래스를 사용하여 byte [] to Long 변환을 수행했지만 bitset이 기본적으로 Little Endian으로 비트 순서를 반전하므로 너무 지루하고 혼란 스럽습니다.
요약:
가장 효율적인 방법으로 각 필드에 대한 사용자 정의 정의를 사용하여 네트워크에서 읽은 bytes []에서 객체로 변환하는 방법은 무엇입니까?
효율성을 위해 각각 또는 아래에 DataInputStream
및이 DataOutputStream
를 사용 합니다. 비트 필드는 직접 프로그래밍해야하지만 이러한 클래스는 네트워크 바이트 순서로 모든 Java 기본 요소를 제공합니다.BufferedInputStream
BufferedOutputStream
게시 한 패킷의 경우 다음과 같은 것이 필요합니다.
class Packet
{
private byte header;
private byte commandCode;
private int sequenceNumber;
private boolean ackStatus;
void write(DataOutput out) throws IOException
{
int wirePacket = header|(commandCode << 4)|(sequenceNumber << 8);
if (ackStatus)
{
wirePacket |= 0x80000000;
}
out.writeInt(wirePacket);
}
static Packet read(DataInput in) throws IOException
{
Packet packet = new Packet();
int wirePacket = in.readInt();
packet.header = (byte)(wirePacket & 0x0f);
packet.commandCode = (byte)((wirePacket >>> 4) & 0x0f);
packet.sequenceNumber = (wirePacket >>> 8) & 0x7FFFFF;
packet.ackStatus = (wirePacket & 0x80000000) != 0;
return packet;
}
// getters and setters. The setters must ensure that the values don't go out of range.
}
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다