gpt4 book ai didi

java - 当前填充混合类型字节数组的最佳方法

转载 作者:行者123 更新时间:2023-12-01 15:34:32 25 4
gpt4 key购买 nike

我正在尝试发送和接收字节流,其中某些字节范围代表不同的数据片段。我已经找到了将单个原始数据类型转换为字节的方法,但我想知道是否有一种简单的方法可以将某些数据片段放入指定的字节区域。

例如,我可能需要生成或阅读如下内容:

byte 1 - int
byte 2-5 - int
byte 6-13 - double
byte 14-21 - double
byte 25 - int
byte 26-45 - string

如有任何建议,我们将不胜感激。

最佳答案

尝试DataOutputStream/DataInputStream或者,对于数组,ByteBuffer类。

要存储 X 字节的整数,可以使用以下方法。如果您认为它的命名不好,您可以使用描述性较差的 i2os 名称,该名称在多个(加密)算法描述中使用。请注意,返回的八位字节字符串使用无符号整数的 Big Endian 编码,您应该为协议(protocol)指定该编码。

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值字节)。

关于java - 当前填充混合类型字节数组的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9104134/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com