在java结构中模仿C ++并写入byte []

时间:2012-04-24 16:07:48

标签: java c++ structure marshalling

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

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

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

谢谢, 杰森

2 个答案:

答案 0 :(得分:3)

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

ByteBuffer并不直接关注对齐,我不知道C ++如何对齐它的输出 - 但是在紧要关头,你可以手动推进它。

答案 1 :(得分: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;
}