我需要将一个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帮助解释这个?
答案 0 :(得分:4)
将GUID编码到其组件字节是一种非标准化操作dealt with differently on Windows/Microsoft platforms(IMO以最令人困惑的方式)。
var g = Guid.Parse("86736036-6034-43c5-9b85-1c833837dbea");
var guidBytes = $"0{g:N}"; //no dashes, leading 0
var pythonicUuidIntValue = BigInteger.Parse(guidBytes, NumberStyles.HexNumber);
将为您提供C#
中的pythonic值 the instructions隐含.ToByteArray
失败的原因:
开始的四字节组和接下来的两个双字节组的顺序相反,而最后两个字节组和结束六字节组的顺序相同。
知道这一点,可能编写一个不涉及通过字符串跳转的方法。为读者练习。
答案 1 :(得分:3)
出于好奇,在这里和那里交换一些字节:-)然后在符号需要时添加一个额外的字节。
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);
(我已经测试了1,000,000个随机Guid
,结果等同于使用@spender方法获得的结果。