비트 크기 정의를 사용한 Java 사용자 정의 직렬화 및 역 직렬화

조이 핀토

문제 : 패킷 형식의 정의가 고정 된 전자 장치에서 네트워크 입력 판독기를 구현해야합니다. 머리글, 바닥 글 및 데이터 본문이 있습니다. 패킷의 필드는 비트로 정의됩니다.

예 : 필드 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 []에서 객체로 변환하는 방법은 무엇입니까?

user207421

효율성을 위해 각각 또는 아래에 DataInputStream및이 DataOutputStream사용 합니다. 비트 필드는 직접 프로그래밍해야하지만 이러한 클래스는 네트워크 바이트 순서로 모든 Java 기본 요소를 제공합니다.BufferedInputStreamBufferedOutputStream

게시 한 패킷의 경우 다음과 같은 것이 필요합니다.

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] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

잭슨 사용자 정의 직렬화 및 역 직렬화

분류에서Dev

Jackson의 다형성 직렬화 / 역 직렬화 및 사용자 지정 직렬화 / 역 직렬화

분류에서Dev

사용자 정의 모양의 Konva 직렬화 및 역 직렬화

분류에서Dev

DateTimeOffset의 속성 기반 사용자 정의 직렬화 / 비 직렬화

분류에서Dev

사용자 지정 클래스의 개체에 대한 NSMutableArray의 직렬화 및 역 직렬화

분류에서Dev

System.Text.Json 사용자 지정 직렬화 / 역 직렬화

분류에서Dev

Django 사용자 지정 역 직렬화

분류에서Dev

Jackson을 사용한 사용자 지정 JSON 직렬화 / 역 직렬화

분류에서Dev

사용자 정의 형식의 날짜를 역 직렬화

분류에서Dev

Json.NET 역 직렬화 및 속성 설정 기 부작용

분류에서Dev

JsonConverter를 사용한 C #의 사용자 지정 JSON 역 직렬화

분류에서Dev

여권 직렬화 / 역 직렬화 사용자의 콜백 기능에 대한 혼란

분류에서Dev

Firestore DB를 사용한 Flutter 데이터 직렬화 및 역 직렬화

분류에서Dev

spring-data-rest 및 컨트롤러는 직렬화 / 역 직렬화에 동일한 objectMaper를 사용합니다.

분류에서Dev

YamlDotNEt 및 C #의 사용자 지정 형식 클래스를 사용하여 중첩 된 YAML 역 직렬화

분류에서Dev

사용자 지정 변환기를 사용하여 스트림에서 Json 역 직렬화

분류에서Dev

기본 배열에 대한 사용자 지정 Gson 역 직렬화

분류에서Dev

Json.NET을 사용하여 ArrayList의 ArrayList를 직렬화 및 역 직렬화하는 방법

분류에서Dev

잭슨 역 직렬화는 사용자 정의 디시리얼라이저에 직렬화를 호출하지

분류에서Dev

Jackson을 사용하여 JAVA 클래스를 대상으로하는 JSON 직렬화 및 역 직렬화

분류에서Dev

Java의 사용자 지정 열거 형 값에 대한 JSON 응답 역 직렬화

분류에서Dev

Java OOP의 역 직렬화

분류에서Dev

Avro를 사용한 중첩 된 특정 유형 역 직렬화

분류에서Dev

Jackson을 사용하여 Lambda 직렬화 및 역 직렬화

분류에서Dev

GSON을 사용하여 열거 형의 사용자 지정 역 직렬화

분류에서Dev

자바의 역 직렬화

분류에서Dev

자바의 역 직렬화

분류에서Dev

개조 : GSON 사용자 지정 자식 목록 역 직렬화

분류에서Dev

개조 : GSON 사용자 지정 자식 목록 역 직렬화

Related 관련 기사

  1. 1

    잭슨 사용자 정의 직렬화 및 역 직렬화

  2. 2

    Jackson의 다형성 직렬화 / 역 직렬화 및 사용자 지정 직렬화 / 역 직렬화

  3. 3

    사용자 정의 모양의 Konva 직렬화 및 역 직렬화

  4. 4

    DateTimeOffset의 속성 기반 사용자 정의 직렬화 / 비 직렬화

  5. 5

    사용자 지정 클래스의 개체에 대한 NSMutableArray의 직렬화 및 역 직렬화

  6. 6

    System.Text.Json 사용자 지정 직렬화 / 역 직렬화

  7. 7

    Django 사용자 지정 역 직렬화

  8. 8

    Jackson을 사용한 사용자 지정 JSON 직렬화 / 역 직렬화

  9. 9

    사용자 정의 형식의 날짜를 역 직렬화

  10. 10

    Json.NET 역 직렬화 및 속성 설정 기 부작용

  11. 11

    JsonConverter를 사용한 C #의 사용자 지정 JSON 역 직렬화

  12. 12

    여권 직렬화 / 역 직렬화 사용자의 콜백 기능에 대한 혼란

  13. 13

    Firestore DB를 사용한 Flutter 데이터 직렬화 및 역 직렬화

  14. 14

    spring-data-rest 및 컨트롤러는 직렬화 / 역 직렬화에 동일한 objectMaper를 사용합니다.

  15. 15

    YamlDotNEt 및 C #의 사용자 지정 형식 클래스를 사용하여 중첩 된 YAML 역 직렬화

  16. 16

    사용자 지정 변환기를 사용하여 스트림에서 Json 역 직렬화

  17. 17

    기본 배열에 대한 사용자 지정 Gson 역 직렬화

  18. 18

    Json.NET을 사용하여 ArrayList의 ArrayList를 직렬화 및 역 직렬화하는 방법

  19. 19

    잭슨 역 직렬화는 사용자 정의 디시리얼라이저에 직렬화를 호출하지

  20. 20

    Jackson을 사용하여 JAVA 클래스를 대상으로하는 JSON 직렬화 및 역 직렬화

  21. 21

    Java의 사용자 지정 열거 형 값에 대한 JSON 응답 역 직렬화

  22. 22

    Java OOP의 역 직렬화

  23. 23

    Avro를 사용한 중첩 된 특정 유형 역 직렬화

  24. 24

    Jackson을 사용하여 Lambda 직렬화 및 역 직렬화

  25. 25

    GSON을 사용하여 열거 형의 사용자 지정 역 직렬화

  26. 26

    자바의 역 직렬화

  27. 27

    자바의 역 직렬화

  28. 28

    개조 : GSON 사용자 지정 자식 목록 역 직렬화

  29. 29

    개조 : GSON 사용자 지정 자식 목록 역 직렬화

뜨겁다태그

보관