存儲我想讀的Java二進制文件。我需要方法來讀取無符號的8位值,無符號的16位值和無符號的32位值。什麼是最好的(最快,最好看的代碼)來做到這一點?我在C++中做到了這一點,做了這樣的事情:轉換4個字節的32位無符號整數,並在相當長的
uint8_t *buffer;
uint32_t value = buffer[0] | buffer[1] << 8 | buffer[2] << 16 | buffer[3] << 24;
但在Java中這將導致一個問題,如果例如緩衝[1]包含有它的符號位設置爲左的結果的值shift是一個int(?)。而不是OR:在特定位置只有0xA5,或者:0xFFFFA500或類似的東西,這會「損害」兩個最高字節。
我有一個代碼,現在看起來像這樣:
public long getUInt32() throws EOFException, IOException {
byte[] bytes = getBytes(4);
long value = bytes[0] | (bytes[1] << 8) | (bytes[2] << 16) | (bytes[3] << 24);
return value & 0x00000000FFFFFFFFL;
}
如果我想這四個字節×67的0xA5 0x72爲0x50的結果轉換爲0xFFFFA567而不是0x5072A567。
編輯:這個偉大的工程:
public long getUInt32() throws EOFException, IOException {
byte[] bytes = getBytes(4);
long value = bytes[0] & 0xFF;
value |= (bytes[1] << 8) & 0xFFFF;
value |= (bytes[2] << 16) & 0xFFFFFF;
value |= (bytes[3] << 24) & 0xFFFFFFFF;
return value;
}
但是是不是有更好的辦法來做到這一點? 10位操作似乎「有點」多的是這樣一個簡單的事情。(見我做什麼呢?)=)
如果您使用的變量很長,那麼ALU將始終以64位執行操作。如果該變量是int,則ALU總是在32位上進行操作(並且使ALU能力的其餘32位未被使用)。對一個字節的操作最有可能使ALU的58位不被使用。這些操作總是發生在一個時鐘週期內,所以說好的10位的「位」不是太多。 –
不,你的工作實施是完全正確的方法。 –
你不需要上面代碼中的最後一個按位和操作:value | =(bytes [3] << 24)&0xFFFFFFFF; –