C# Guid为128位整数
我需要将guid转换为大整数。。这很好,但在测试过程中,我强调了一些需要向我解释的内容;) 如果我这样做:C# Guid为128位整数,c#,python-2.7,C#,Python 2.7,我需要将guid转换为大整数。。这很好,但在测试过程中,我强调了一些需要向我解释的内容;) 如果我这样做: var g = Guid.NewGuid(); // 86736036-6034-43c5-9b85-1c833837dbea var p = g.ToByteArray(); var x = new BigInteger(p); // -28104782885366703164142972435490971594 但是如果我在p
var g = Guid.NewGuid(); // 86736036-6034-43c5-9b85-1c833837dbea
var p = g.ToByteArray();
var x = new BigInteger(p); // -28104782885366703164142972435490971594
但是如果我在python中这样做。。我得到了一个不同的结果:
import uuid
x = uuid.UUID('86736036-6034-43c5-9b85-1c833837dbea')
print x
print x.int # 178715616993326703606264498842288774122
对python和.net有更深入了解的人能解释一下吗?将GUID编码为其组件字节是一种非标准化操作(IMO以一种最令人困惑的方式) 将从C中获得pythonic值#
.ToByteArray
失败的原因隐含在:
开始的四字节组和接下来的两个两字节组的顺序相反,而最后两个两字节组和结束的六字节组的顺序相同
知道了这一点,就有可能编写一个不需要遍历字符串的方法。读者的一个练习。将GUID编码为其组件字节是一种非标准化操作(IMO以最令人困惑的方式) 将从C中获得pythonic值#
.ToByteArray
失败的原因隐含在:
开始的四字节组和接下来的两个两字节组的顺序相反,而最后两个两字节组和结束的六字节组的顺序相同
知道了这一点,就有可能编写一个不需要遍历字符串的方法。读者的练习。只是出于好奇,在这里和那里交换一些字节:-),然后在必要时为符号添加一个额外的字节
var g = new Guid();
var bytes = g.ToByteArray();
var bytes2 = new byte[bytes[3] >= 0x7F ? bytes.Length + 1 : bytes.Length];
bytes2[0] = bytes[15];
bytes2[1] = bytes[14];
bytes2[2] = bytes[13];
bytes2[3] = bytes[12];
bytes2[4] = bytes[11];
bytes2[5] = bytes[10];
bytes2[6] = bytes[9];
bytes2[7] = bytes[8];
bytes2[8] = bytes[6];
bytes2[9] = bytes[7];
bytes2[10] = bytes[4];
bytes2[11] = bytes[5];
bytes2[12] = bytes[0];
bytes2[13] = bytes[1];
bytes2[14] = bytes[2];
bytes2[15] = bytes[3];
var bi2 = new BigInteger(bytes2);
(我对1000000个随机
Guid
进行了测试,结果与@spender方法得到的结果相同)。只是出于好奇,在这里和那里交换了一些字节:-),然后在必要时为符号添加一个额外的字节
var g = new Guid();
var bytes = g.ToByteArray();
var bytes2 = new byte[bytes[3] >= 0x7F ? bytes.Length + 1 : bytes.Length];
bytes2[0] = bytes[15];
bytes2[1] = bytes[14];
bytes2[2] = bytes[13];
bytes2[3] = bytes[12];
bytes2[4] = bytes[11];
bytes2[5] = bytes[10];
bytes2[6] = bytes[9];
bytes2[7] = bytes[8];
bytes2[8] = bytes[6];
bytes2[9] = bytes[7];
bytes2[10] = bytes[4];
bytes2[11] = bytes[5];
bytes2[12] = bytes[0];
bytes2[13] = bytes[1];
bytes2[14] = bytes[2];
bytes2[15] = bytes[3];
var bi2 = new BigInteger(bytes2);
(我对1000000个随机
Guid
进行了测试,结果与@spender方法得到的结果相同)。我应该学会阅读这个问题。C代码似乎将其视为有符号整数,我认为这没有意义。我之前的陈述得到了以下方面的证实:构造函数希望字节数组中的正值使用符号和大小表示,负值使用2的补码表示。换句话说,如果设置了值中最高顺序字节的最高顺序位,则生成的BigInteger值为负。“有帮助吗?不保留顺序,它与python不兼容,因为python的GUID.hex
保留字节的顺序。我应该学习阅读问题。C代码似乎将其视为有符号整数,我认为这没有意义。我之前的陈述得到以下方面的证实:”构造函数希望字节数组中的正值使用符号和大小表示,负值使用2的补码表示。换句话说,如果设置了值中最高顺序字节的最高顺序位,则生成的BigInteger值为负。“是否有帮助?不保留顺序,它与python不兼容,因为python的GUID.hex
保留了bytes@Freggar有人问过:@Freggar有人问过:好吧,我还是有点不明白为什么这些东西需要交换……我会阅读支持文章,然后回来……非常感谢!@m1nkeh因为有人认为它们的内部格式不同。BigInteger是小尾端,而Guid是大尾端,但它们不是一个大数字,而是许多小数字(4个字节中的一个,2个字节中的两个,1个字节中的8个)。顺便说一句,你的行做什么?@m1nkeh我按“正确”的顺序复制字节,交换其中的一些(你可以看到右边的索引器不仅仅是15…0,而是15…8,6,7,4,5,0,1,2,3)@m1nkeh有一个关于微软使用的格式的注释(第二个)好吧,我还是有点不明白为什么这些东西需要交换。我会阅读支持文章,然后回来…非常感谢!@m1nkeh,因为有人认为它们的内部格式不同。biginger是小端,而Guid是大端,但它们不是一个大数,而是许多小数(4个字节中的一个,2个字节中的两个,1个字节中的8个)。顺便说一句,你的行是做什么的?@m1nkeh我按“正确”的顺序复制字节,交换其中的一些(你可以看到右边的索引器不是简单的15…0,而是15…8,6,7,4,5,0,1,2,3)@m1nkeh有一个关于微软使用的格式的注释(第二个)