【问题标题】:Java like function getLeastSignificantBits() & getMostSignificantBits in Python?Java 中的函数 getLeastSignificantBits() 和 getMostSignificantBits 在 Python 中?
【发布时间】:2016-10-19 20:25:10
【问题描述】:

有人可以帮我形成一个简单的函数来提取 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

【问题讨论】:

  • 你能edit你的问题吗?删除我们不知道的 java 代码或向我们展示u 的值以及您的期望。
  • 所以我添加了最低有效位输出作为我在 Java 中使用上述代码获得的长值。

标签: python bitmap bit


【解决方案1】:

efe640fc5d2f0036 十进制是 17286575672347525174。从中减去 0x10000000000000000 并取反:你得到 -1160168401362026442

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

请注意,这只是猜测,但似乎适用于您提供的唯一测试用例(幸运的是它是否定的)。称之为逆向工程。

取最后 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)

【讨论】:

  • 您的答案对我来说似乎是正确的,尽管我查看了 UUID 类并获得了该类为填充最低和最高有效位所做的确切 Java 代码。你能看看这个并更新你的答案吗?
【解决方案2】:

旧帖子,但仍然...只是想我会添加这个:

import struct
import uuid

u = uuid.UUID('c88524da-d88f-11e9-9185-f85971a9ba7d')
msb, lsb = struct.unpack(">qq", u.bytes)

这给出了值:
(-3997748571866721815,-7960683703264757123) ...如果我将这些输入到 java.util.UUID 构造函数中,它会返回 uuid "c88524da-d88f-11e9-9185-f85971a9ba7d"

【讨论】:

  • 很好的答案,谢谢!对于那些也在寻找其他方式的人:uuid.UUID(bytes=struct.pack(">qq", msb, lsb))
猜你喜欢
  • 1970-01-01
  • 2013-11-12
  • 2020-02-14
  • 2012-10-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-04
  • 2010-10-30
相关资源
最近更新 更多