在字节缓冲区中处理不同数据类型的最佳实践是什么
What is the best practice of handling different data types in byte buffer
所以我有像这样存储数据包的时间序列:
第一个数据包:
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);
第 n 个数据包:
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};
但是也可以识别为double 0.0值。你有什么建议或最佳做法,我可以标记这个字符串以便它可以与数据包分开?
正常做法是,以类型标记开始您的各种数据包,最后是长度信息。以 TCP/IP 的包定义为例。
best 实践是非常主观的。我个人最好的办法是,根本不关心这些低级的东西,并序列化格式正确的对象(一个用于 long 和 double 的 5 个字符,一个用于中间字符串。)
恕我直言,最好创建一个 class 来为数据建模
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);
}
}
将您的数据作为从 Packet 对象序列化的字节数组放入 ByteBuffer。你应该在获取数据时反序列化它。这样你就可以很容易地检查它是否是随机字符串。
所以我有像这样存储数据包的时间序列:
第一个数据包:
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);
第 n 个数据包:
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};
但是也可以识别为double 0.0值。你有什么建议或最佳做法,我可以标记这个字符串以便它可以与数据包分开?
正常做法是,以类型标记开始您的各种数据包,最后是长度信息。以 TCP/IP 的包定义为例。
best 实践是非常主观的。我个人最好的办法是,根本不关心这些低级的东西,并序列化格式正确的对象(一个用于 long 和 double 的 5 个字符,一个用于中间字符串。)
恕我直言,最好创建一个 class 来为数据建模
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);
}
}
将您的数据作为从 Packet 对象序列化的字节数组放入 ByteBuffer。你应该在获取数据时反序列化它。这样你就可以很容易地检查它是否是随机字符串。