我正在尝试发送和接收一个字节流,其中某些字节范围代表不同的数据段。我已经找到了将单个原始数据类型转换为字节的方法,但我想知道是否有一种直接的方法将某些数据段放入指定的字节区域。
例如,我可能需要生成或读取以下内容:
byte 1 - int
byte 2-5 - int
byte 6-13 - double
byte 14-21 - double
byte 25 - int
byte 26-45 - string如有任何建议,我们将不胜感激。
发布于 2012-02-02 06:18:09
尝试使用DataOutputStream/DataInputStream,或者对于数组,使用ByteBuffer类。
为了以X字节存储整数,您可以使用以下方法。如果你认为它的名字不好,你可以使用描述性差得多的i2os名称,它在几个(加密)算法描述中使用。请注意,返回的二进制八位数字符串使用无符号整数的Big Endian编码,这应该为您的协议指定。
public static byte[] possitiveIntegerToOctetString(
final long value, final int octets) {
if (value < 0) {
throw new IllegalArgumentException("Cannot encode negative values");
}
if (octets < 1) {
throw new IllegalArgumentException("Cannot encode a number in negative or zero octets");
}
final int longSizeBytes = Long.SIZE / Byte.SIZE;
final int byteBufferSize = Math.max(octets, longSizeBytes);
final ByteBuffer buf = ByteBuffer.allocate(byteBufferSize);
for (int i = 0; i < byteBufferSize - longSizeBytes; i++) {
buf.put((byte) 0x00);
}
buf.mark();
buf.putLong(value);
// more bytes than long encoding
if (octets >= longSizeBytes) {
return buf.array();
}
// less bytes than long encoding (reset to mark first)
buf.reset();
for (int i = 0; i < longSizeBytes - octets; i++) {
if (buf.get() != 0x00) {
throw new IllegalArgumentException("Value does not fit in " + octets + " octet(s)");
}
}
final byte[] result = new byte[octets];
buf.get(result);
return result;
}在存储字符串之前进行编辑,考虑填充机制(最常用的是空格)和字符编码,例如String.getBytes(Charset.forName("ASCII"))或"Latin-1"。这些是最常见的编码,每个字符只有一个字节。计算"UTF-8“的大小稍微困难一些(首先进行编码,最后使用ByteBuffer添加0x20值的字节)。
发布于 2012-02-02 06:22:21
您可能需要考虑为每种数据类型设置一个恒定大小。例如,32位Java int将占用4个字节,长度将占用8个字节,依此类推。实际上,如果您使用Java的DataInputStream和DataOutputStreams,您基本上就是在这样做。它们有非常好的方法,比如read/writeInt等。
https://stackoverflow.com/questions/9104134
复制相似问题