2012-06-26 46 views
2

我在一個小的Java項目的工作目標是一個位集合轉換成數位集,以及0字節,然後將這些字節的多個陣列:如何轉換虛假初始化一個bitset在Java中

對於例如,我想在兩個部分位集合分裂和各部分轉換成一個int:

byte[] bytesToBeConverted = {(byte)0x05, (byte)0x00}; 
    BitSet bitSetToBeConverted = BitSet.valueOf(bytesToBeConverted); 

BitSet BitSetPart1 =new BitSet(8); 
BitSetPart1=bitSetToBeConverted.get(0,8); 
int intPart1 = (int)(BitSetPart1.toByteArray()[0]); //intPart1 ==5 

BitSet BitSetPart2 =new BitSet(8); 
BitSetPart2 = bitSetToBeConverted.get(8,16); 
int intPart2 = (int)(BitSetPart2.toByteArray()[0]); //intPart2 == 0 is wanted 

而沒有問題確實發生在所述第一部分(轉換bitSetPart1成intPart1),第二部分,其中BitSetpart2具有用false初始化時,會在訪問方法的結果toByteArray()時引發異常:java.lang.ArrayIndexOutOf BoundsException toByteArray在這種情況下似乎返回null。

這是否意味着零是該類操作的禁用價值? 在這種情況下,你寧願擴展BitSet類並覆蓋toByteArray()方法嗎? 或創建一個與BitSet完全分離的類,並使用額外的方法來解決該問題?

還是有另一種方式來執行我沒有提到的那種操作?

非常感謝您的回答!

回答

2

toByteArray()的Javadoc:

更確切地說,如果

byte[] bytes = s.toByteArray(); 

然後

bytes.length == (s.length()+7)/8 

,並從length()的Javadoc:

返回此BitSet的「邏輯大小」:最高設置位的位集索引加1。如果BitSet不包含設定位,則返回零。

由於第二BitSet不包含組位,它返回零長度的陣列,作爲的Javadoc明確規定。

如果您想將toByteArray()的結果填充到指定的字節數,請使用Arrays.copyOf(bitSet.toByteArray(), desiredLength)

+0

非常感謝!更一般的情況是,你寧願重寫擴展類中的toByteArray()方法或創建一個靜態方法來封裝原始BitSet.toByteArray()? –

+1

@Kate_Bush重寫'toByteArray'方法會破壞它的合約。一般來說,如果你不能確保(或故意打破)Liskov替代原則,繼承不是答案。 – alf

+0

確實。提供另一種方法從'BitSet'獲取所需的輸出;不要延長或違反合同。 (事實上​​,它應該是最終的......) –

0

空位返回一個空數組,因此得到[0]確實是非法的。

嘗試

BitSetPart2 = bitSetToBeConverted.get(8,16); 
byte[] temp = BitSetPart2.toByteArray(); 
int intPart2 = temp.length == 0 ? 0 : (int)(temp[0]); 

代替