所以我有时间序列,我按照这个顺序存储数据包:
First Packet:
RandomAccessFile raf = new RandomAccessFile(file, "rw");
FileChannel fc = raf.getChannel();
ByteBuffer bt = ByteBuffer.allocateDirect(1024);
...
bt.putChar('X');
bt.putChar('X');
bt.putChar('X');
bt.putChar('X');
bt.putChar('E');
bt.putLong(new Date().getTime());
bt.putDouble(0.8546324324234d);
第二个数据包:
bt.putChar('X');
bt.putChar('X');
bt.putChar('X');
bt.putChar('X');
bt.putChar('E');
bt.putLong(new Date().getTime());
bt.putDouble(0.8546324324234d);
nTh数据包:
bt.putChar('X');
bt.putChar('X');
bt.putChar('X');
bt.putChar('X');
bt.putChar('E');
bt.putLong(new Date().getTime());
bt.putDouble(0.8546324324234d);
如您所见,所有数据包具有相同的序列,但我有一个案例,我在两个数据包之间不时收到随机字符串:
bt.putChar('R');
bt.putChar('A');
bt.putChar('N');
bt.putChar('D');
所以我认为我应该使用某种字节顺序标记作为前导字节来注释这个字符串。这样的事情:
public static final byte[] BYTE_MARK = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
但它也可以被识别为双倍0.0值。你有什么建议或最佳实践可以标记这个字符串,以便它可以与数据包分开?
答案 0 :(得分:1)
正常练习是,使用类型标记和最终长度信息启动各种数据包。以TCP / IP的包定义为例。
best practive非常主观。我个人最好的是,根本不关心这种低级别的东西,并序列化格式良好的对象(一个用于你的5个字符,长和双,一个用于你的中间字符串。)
答案 1 :(得分:1)
恕我直言,如果您创建一个类来建模数据
,那就更好了class Packet implements Serializable {
private static final long serialVersionUID = -603367644775755382L;
public static final int SIZE = 512;
private boolean isRandomString;
private int dataSize;
private byte[] data;
public Packet(boolean isRandomString, byte[] data) {
this.isRandomString = isRandomString;
this.dataSize = data.length;
this.data = Arrays.copyOf(data, SIZE);
}
}
将数据放入ByteBuffer,作为从Packet对象序列化的字节数组。并且您应该在获取数据时对其进行反序列化。通过这种方式,您可以轻松检查它是否是随机字符串。