2012-04-24 30 views
1

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

我的问题是这样的:什么是最简单的方式写入字节值的字节[]?我知道我可以在那里放置1个值,然后抵消特定数量的字节,并根据需要重复,但是这是做到这一点的最佳方式吗?

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

感谢, 杰森

+1

首先,Java没有无符号类型。你需要付出一些沉重的代价。 – 2012-04-24 16:09:54

+0

有几种方法可以将Java类型视为未签名,但它们需要非常小心,不要混淆这些值。 – 2012-04-24 16:13:07

+0

您可以写入无符号值,就好像它们是有符号的。通常最多只需要演员阵容。 – 2012-04-24 16:22:26

回答

3

您可能会发现它更容易使用ByteBuffer,这可能是在Java中的最好的方式组织逐字节输出。尽管如此,我不知道C++是如何对齐输出的 - 但是在一个小小的情况下,你可以直接手动推进它。

+1

+1:您还可以使用ByteBuffer控制字节顺序。 – 2012-04-24 16:21:46

0

使用包装一个ByteArrayOutputStream

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(); 

如果你的代码可能会被解析与无符号整数,那么你就要有一点头痛的类似字节数组DataOutputStream类。也就是说,你将不得不检查负数,并适当地处理它们。 例如。

int unsignedIntAsSignedInt = inStream.readInt(); 
long realData; 
if (unsignedIntAsSignedInt < 0) { 
    realData = ((long) unsignedIntAsSignedInt) - (((long)Integer.MIN_VALUE) * 2); 
} else { 
    realData = unsignedIntAsSignedInt; 
} 
+0

这并没有工作,因为我在一台Windows机器上工作。在写出数据时,我需要能够将字节序列设置为LITTLE_ENDIAN。 – Jason 2012-04-24 19:43:31