如何使用java读取给定的二进制结构?

时间:2013-05-01 05:21:42

标签: java struct binary buffer

我正在尝试解码和读取从设备发送的二进制数据,我需要提取二进制结构内的十进制数。 这是结构细节:

(2)同步消息格式 typedef struct

{
    WORD
    SyncHeader;
    WORD 
    SyncID;
    DWORD UnitID;
} SyncStruct;
  • SyncHeader始终为0xf8fa
  • SyncID是邮件序列号
  • UnitID是单位标识号

例如,收到的消息是

0xFA 0xF8 0x1B 0x01 0x81 0x60 0x33 0x3C

  • SyncHeader = 0xF8 0xFA
  • SyncID = 0x01 0x1B(Decimal = 283)
  • UnitID = 0x3C 0x33 0x60 0x81(Decimal = 1010000001)

现在,如果结构定义良好,我有一个小的java代码,它读取不同的结构,但实现了相同的原则:

private String getId(ChannelBuffer buf) {

    String id = "";
    for (int i = 0; i < 7; i++) {
        int b = buf.getUnsignedByte(i);

        // First digit
        int d1 = (b & 0xf0) >> 4;
        if (d1 == 0xf) break;
        id += d1;

        // Second digit
        int d2 = (b & 0x0f);
        if (d2 == 0xf) break;
        id += d2;
    }

    return id;
}

我需要对我的小型java代码进行哪些修改才能在变量中读取和存储SyncID消息序列号(十进制值)?

由于

1 个答案:

答案 0 :(得分:1)

将您的字节放在一个字节数组中,并使用ByteBuffer从中读取数字

    ByteBuffer bb = ByteBuffer.wrap(byteArray);
    int syncHeader =  bb.getShort();
    int syncId =  bb.getShort();
    int unitId = bb.getInt();

也可以只读取syncId

    ByteBuffer bb = ByteBuffer.wrap(byteArray);
    int syncId =  bb.getShort(2);