rishabh - 8 months ago 61
Python Question

# Java like function getLeastSignificantBits() & getMostSignificantBits in Python?

Can someone please help me out in forming an easy function to extract the leastSignificant & mostSignificant bits in Python?

Ex code in 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;
}
``````

--> Output value: -1160168401362026442

`efe640fc5d2f0036` in decimal is 17286575672347525174. Substract `0x10000000000000000` from it & negate: you get `-1160168401362026442`

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

Note that it's only guesswork but seems to work with the sole test case you provided (fortunately it was negative). Call that reverse engineering.

Take 2 last hex values (dash separated) and join them. I suppose the storage means that it becomes negative when first digit is above 7, so negate it with higher 2-power if that's the case:

``````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'))
``````

result:

``````-1160168401362026442
``````

I cannot help further for the most significant bytes part but now you'll figure it out.