Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/267.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Guid为128位整数_C#_Python 2.7 - Fatal编程技术网

C# Guid为128位整数

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

我需要将guid转换为大整数。。这很好,但在测试过程中,我强调了一些需要向我解释的内容;)

如果我这样做:

        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有一个关于微软使用的格式的注释(第二个)