2012-04-24 27 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