2015-10-15 44 views
-2

2'complement中有14位帶符號二進制(密封在16位)的負載通過BLE(藍牙低能量)從傳感器收集這些數據。我想將它轉換爲十進制。使用python在2'complement格式中操作的字節

我發現JAVA一個代碼段可以解析器正確的順序14位二進制。但我是編碼python的新手。你能解釋什麼是c [offset + 1]和c [offset] & 0xFF?以及它如何在python中表達?

private static Integer shortSignedAtOffset(byte[] c, int offset) { 
    Integer lowerByte = (int) c[offset] & 0xFF; 
    Integer upperByte = (int) c[offset+1]; // // Interpret MSB as signed 
    return (upperByte << 8) + lowerByte; 
} 

例如: 一個= 0010 1000 0000 0000 是右如果我說一個+ 1等於C [偏移+ 1]?什麼是二進制抵消,特別是與傳感器有關? 非常感謝 請回答我。真的需要幫助。

+0

喜利弊,做我發燒了。如果你不想回答,請讓其他人幫助我。 – ediiiiiiii

回答

0

將設備中的2'補碼數字解碼爲十進制。編寫代碼之前必須考慮3個步驟。

  1. 什麼是輸入格式?字符串或整數?
  2. 輸出多少位?有多少位需要轉換?例如,以16位輸出密封的14位數據。所以在計算之前必須移動2位[可能是正確的或者左邊的]。
  3. 什麼樣的數據endian在您的輸出中,無論是大端還是小端?如果輸出爲[0:7],[8:15],則最好將其位置改爲[15,14,13 .....,2,1,0]。然後做轉變,然後計算價值。

下面的代碼代表的十六進制字符串到十進制

def twocompbinstr(valstr, bits): 
     if type(valstr) is str: 
      valstr = int(valstr, 16) #expect hex in string format 
     if (valstr & (1 << (bits - 1))) != 0: 
      valstr = valstr - (1 << bits) 
     return valstr 

測試代碼:

h = '3aff' # 0011 1010 1111 1111 
    # 14bits 2'complement integer is sealed in 16bit format. 
    e = twocompbinstr(h,14) 
    print e, type(e) 

    output: 
    -1281 <type 'int'> 
0

你的理解是錯誤的,offset是一個數組索引。

a=0x2A01,這是多麼a存儲在內存中:

a = 0010 1000 0000 0001 

如果我們把a爲字節數組(byte []),由c表示:

c[0] = 0x2 
c[1] = 0xA 
c[2] = 0x0 
c[3] = 0x1 

然後你就可以操縱單獨的字節並將它們打包回整數。
整數轉換爲字節數組(反之亦然)因語言而異。
如果遇到問題,請發表不同的問題。

+0

謝謝你的回答。我仍然困惑。所以這裏有什麼抵消? lowerByte =(int)c [offset] & 0xFF;是否找到一個特殊的地方做「&」工作?所以它會像這樣:c [1]&0xFF?爲什麼會出現兩個FF(一個字節)?但是,這個Java片段是不正確的。 – ediiiiiiii