2016-10-19 18 views
0

Может ли кто-нибудь помочь мне в создании простой функции для извлечения наименее значимых & самых значащих битов в Python?Java как функция getLeastSignificantBits() & getMostSignificantBits в Python?

Ex-код в 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 от него & NEGATE: вы получаете -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 

EDIT: предоставление способа которая занимает всю строку и возвращает 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

ответ отредактирован с помощью нового метода утилиты. –