2016-10-19 69 views
0

有人可以幫助我形成一個簡單的函數,以提取Python中最不顯着的位數&?Java中的函數getLeastSignificantBits()&getMostSignificantBits在Python中?

防爆代碼Java中:

UUID u = UUID.fromString('a316b044-0157-1000-efe6-40fc5d2f0036'); 
long leastSignificantBits = u.getLeastSignificantBits(); 

private UUID(byte[] data) { 
    long msb = 0; 
    long lsb = 0; 
    assert data.length == 16 : "data must be 16 bytes in length"; 
    for (int i=0; i<8; i++) 
     msb = (msb << 8) | (data[i] & 0xff); 
    for (int i=8; i<16; i++) 
     lsb = (lsb << 8) | (data[i] & 0xff); 
    this.mostSigBits = msb; 
    this.leastSigBits = lsb; 
} 

- >輸出值:-1160168401362026442

+1

你能否[編輯]你的問題?刪除我們不知道的Java代碼,或者告訴我們'u'的價值和你的期望。 –

+0

所以我添加了最小有效位輸出作爲一個長的值,我在Java中使用上述代碼。 – rishabh

回答

1

efe640fc5d2f0036十進制是17286575672347525174.。減去0x10000000000000000從中&否定:你拿到-1160168401362026442

int("efe640fc5d2f0036",16)-0x10000000000000000 -> -1160168401362026442 

請注意,這只是猜測,但似乎與您提供的唯一測試用例一起工作(f幸運的是它是負面的)。稱之爲逆向工程。

取2個最後的十六進制值(破折號分隔)並加入它們。我想,存儲裝置,當第一個數字是上述7就變成負的,所以具有較高的2-功率否定它,如果是這種情況:

def getLeastSignificantBits(s): 
    hv = "".join(s.split("-")[-2:]) 
    v = int(hv,16) 
    if int(hv[0],16)>7: 
     # negative 
     v = v-0x10000000000000000 
    return v 

print(getLeastSignificantBits('a316b044-0157-1000-efe6-40fc5d2f0036')) 

結果:

-1160168401362026442 

編輯:提供一種方法這需要整個字符串,並返回LSB & MSB夫婦

def getLeastMostSignificantBits(s): 
    sp=s.split("-") 
    lsb_s = "".join(sp[-2:]) 
    lsb = int(lsb_s,16) 
    if int(lsb_s[0],16)>7: 
     # negative 
     lsb = lsb-0x10000000000000000 

    msb_s = "".join(sp[:3]) 
    msb = int(msb_s,16) 
    if int(msb_s[0],16)>7: 
     # negative 
     msb = msb-0x10000000000000000 

    return lsb,msb 

print(getLeastMostSignificantBits('a316b044-0157-1000-efe6-40fc5d2f0036')) 

結果:

(-1160168401362026442, -6694969989912915968) 
+0

你的答案對我來說看起來是正確的,儘管我看了一下UUID類並得到了確切的Java代碼,該類正在做什麼來填充最少和最重要的位。你能否好好看看這個並更新你的答案? – rishabh

+0

回答用新的實用方法編輯。 –