2015-09-19 25 views
-1

我正在嘗試開發一個程序來讀取某些類型的文件,並以位級別提取此文件的所有包信息。瞭解字節數組上的按位操作

分組被劃分爲:

  • SYC:8位
  • TEI:1個比特
  • PSI:1位
  • TP:1位
  • PID:13位
  • TSC:2位
  • AFC:2位
  • CC:4位

我的問題是:如何分別得到位?例如PID,5位位於陣列的位置1,位置2位於8位;我如何從2個獨立的字節獲取這些信息並在之後進行求和?

我有這樣的示例代碼,以獲得PID和它再現了正確的結果:

int PID1 = (buf [1] << 8) | (buf [2] & 0xff); 

我不明白這個公式,尤其是buf [1] << 8。有人可以向我解釋這個等式嗎?我應該怎麼做才能得到包裹信息的其餘部分?

+0

查看[Bitwise和Bit Shift Operators](https://docs.oracle.com/javase/tutorial/java/nutsandbolts/op3.html)或者[Java Bit Manipulation Guide](http:// sys.cs.rice.edu/course/comp314/10/p2/javabits.html),或者簡單的Google ['java bitwise operators'](https://www.google.com/search?q=java+bitwise+符&即= UTF-8&OE = UTF-8)。 – Andreas

+0

我已經看到了這些@Andreas。我的問題是:我需要從一個字節獲得5位,並與另一個8位進行求和。在這種情況下,爲什麼使用buf [1] << 8,這對我的問題意味着什麼?爲什麼不是3,因爲我只需要5位? – kileros

回答

0

「< <」操作符將二進制中的位位置向右移動,這與二進制乘法基本相同。

此代碼:

byte buf[] = new byte[2]; 
buf[1] = 3; 
for (int i = 0; i < 9; i++) { 
    int bshifted = buf[1]<<i; 
    System.out.println("buf[1]<<"+i+" = " + Integer.toBinaryString(bshifted) +"(binary) = "+ bshifted + "(decimal)"); 
} 

產生這樣的輸出:

buf[1]<<0 = 11(binary) = 3(decimal) 
buf[1]<<1 = 110(binary) = 6(decimal) 
buf[1]<<2 = 1100(binary) = 12(decimal) 
buf[1]<<3 = 11000(binary) = 24(decimal) 
buf[1]<<4 = 110000(binary) = 48(decimal) 
buf[1]<<5 = 1100000(binary) = 96(decimal) 
buf[1]<<6 = 11000000(binary) = 192(decimal) 
buf[1]<<7 = 110000000(binary) = 384(decimal) 
buf[1]<<8 = 1100000000(binary) = 768(decimal) 

整個表達(buf [1] << 8) | (buf [2] & 0xff)具有BUF移動[1]出低階的INT的8位和推杆的效果只有buf [2]的低8位進入該整數部分。