1

我正在将一些 C++ 代码移植到 java,在我的特定实例中,我正在将数据写入要写入文件的 byte[]。第一部分,如 C++ 中所定义,是一个由一个 uint 和 3 个 ushort 组成的结构。第二部分是数据的主要部分,我将在将其发送到输出流之前将其附加到 byte[] 的末尾。

我的问题是:将标头值写入字节 [] 的最简单方法是什么?我知道我可以在其中放入 1 个值,然后偏移特定的字节数,并根据需要重复,但这是最好的方法吗?

另外,我如何管理字节对齐?C++ 代码似乎使用默认值(4 字节?)进行对齐。

谢谢,杰森

4

2 回答 2

3

您可能会发现它更易于使用ByteBuffer,这可能是 Java 中按字节组织输出的最佳方式。

ByteBuffer不过,并不直接关心对齐,而且我不知道 C++ 是如何对齐其输出的——但在紧要关头,您可以手动推进它。

于 2012-04-24T16:09:25.383 回答
0

使用包装 ByteArrayOutputStream 的 DataOutputStream

ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream()
DataOutputStream stream = new DataOutputStream(byteArrayOutputStream);

try {
    stream.writeInt(i);
    stream.writeShort(s0);
    stream.writeShort(s1);
    stream.writeShort(s2);
    stream.flush();
} catch (IOException e) {
    // this can't happen, but you still require a try catch block
}

byte[] array = byteArrayOutputStream.toByteArray();

如果您的代码可能正在使用无符号整数解析类似的字节数组,那么您会有点头疼。也就是说,您必须检查负数并适当地处理它们。例如。

int unsignedIntAsSignedInt = inStream.readInt();
long realData;
if (unsignedIntAsSignedInt < 0) {
    realData = ((long) unsignedIntAsSignedInt) - (((long)Integer.MIN_VALUE) * 2);
} else {
    realData = unsignedIntAsSignedInt;
}
于 2012-04-24T16:27:00.300 回答