【问题标题】:Java - Object to Fixed Byte ArrayJava - 固定字节数组的对象
【发布时间】:2015-11-11 09:50:23
【问题描述】:

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

请求示例:

short MessageID = 5;
int TransactionTrace = 1; 

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

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

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

序列化返回太多字节。

有人可以帮忙吗?

谢谢。

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));              
} 

【问题讨论】:

  • 序列化不是这样工作的。如果您阅读过文档,您就会知道。

标签: java


【解决方案1】:

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]
}

【讨论】:

  • 感谢您的解释和解决方案。
猜你喜欢
  • 1970-01-01
  • 2013-12-07
  • 1970-01-01
  • 1970-01-01
  • 2022-01-01
  • 2016-05-14
  • 1970-01-01
  • 2013-04-29
  • 2011-02-19
相关资源
最近更新 更多