Java - 固定字节数组的对象

时间:2015-08-18 12:41:58

标签: java

我需要连接到第三方系统并通过TCP / socket检索一些数据。 将要发送的数据格式是固定长度格式和二进制格式。

请求示例:

short MessageID = 5;
int TransactionTrace = 1; 

基本上,我必须向第三方系统发送6个字节。十六进制数据:000500000001

我尝试在Java中执行以下操作,但它不起作用。

  1. 创建一个包含两个变量和正确数据类型(messageID& transactionTrace)的类
  2. 将类序列化为字节数组
  3. 序列化返回太多字节。

    有人可以帮忙吗?

    谢谢。

    Java类:

    public final class MsgHeader implements Serializable  {
    
        public short MessageID;
        public int TransactionTrace;
    }
    

    序列化:

    MsgHeader header = new MsgHeader(); 
    ByteArrayOutputStream bos = new ByteArrayOutputStream();
    ObjectOutputStream out = null;
    
    try 
    {
          out = new ObjectOutputStream(bos);   
          out.writeObject(header);
          byte[] yourBytes = bos.toByteArray();     
    
          System.out.println("Hex Data : " + getHex(yourBytes));              
    } 
    

1 个答案:

答案 0 :(得分:4)

Java序列化使用自己的格式,这种格式不太可能与您之后的格式相匹配。

我使用marshaller创建一个单独的ByteBuffer类,以正确的格式写出值。这也将允许指定大或小端。

private static class Message {
    short messageID = 5;
    int transactionTrace = 1;
    public short getMessageID() {
        return messageID;
    }

    public int getTransactionTrace() {
        return transactionTrace;
    }
}

private static class MessageMarshaller {
    public static byte[] toBytes(Message message) {
        ByteBuffer buffer = ByteBuffer.allocate(6);
        buffer.order(ByteOrder.BIG_ENDIAN);
        buffer.putShort(message.getMessageID());
        buffer.putInt(message.getTransactionTrace());
        return buffer.array();
    }
}

public static void main(String[] args) {
    System.out.println(Arrays.toString(MessageMarshaller.toBytes(new Message()))); 
    // ==> Outputs [0, 5, 0, 0, 0, 1]
}