我正在将一些C ++代码移植到java,在我的特定实例中,我将数据写入要写入文件的byte []。 C ++中定义的第一部分是由uint和3个ushorts组成的结构。第二部分是数据的主要部分,我将在发送到输出流之前将其附加到byte []的末尾。
我的问题是:将标题值写入byte []的最简单方法是什么?我知道我可以在其中放入1个值,然后偏移特定的字节数,并根据需要重复,但这是最好的方法吗?
另外,我如何管理字节对齐? C ++代码似乎使用默认值(4字节?)进行对齐。
谢谢, 杰森
答案 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;
}