我正在尝试模拟C#应用程序将UUID转换为Base64值的方式。出于某种原因,我可以得到部分字符串以匹配期望值,而不是整个字符串。
为我提供的C#代码:
public static string ToShortGuid(this Guid newGuid) {
string modifiedBase64 = Convert.ToBase64String(newGuid.ToByteArray())
.Replace('+', '-').Replace('/', '_') // avoid invalid URL characters
.Substring(0, 22);
return modifiedBase64;
}
我在Python 3.6中尝试过的事情:
import uuid
import base64
encode_str = = base64.urlsafe_b64encode(uuid.UUID("fa190535-6b00-4452-8ab1-319c73082b60").bytes)
print(encode_str)
“ fa190535-6b00-4452-8ab1-319c73082b60”是已知的UUID,该应用程序显然使用上述c#代码来生成“ ShortGuid”值“ NQUZ-gBrUkSKsTGccwgrYA”。
当我通过Python代码处理相同的UUID时,我得到:“ -hkFNWsARFKKsTGccwgrYA ==”
在这两个输出字符串中,此部分都匹配:“ KsTGccwgrYA”,但其余部分不匹配。
答案 0 :(得分:6)
ul {
list-style: none;
padding: 0;
margin: 0;
height: 100%;
}
ul li {
display: inline-block;
padding: 15px;
}
ul li ul li{
margin: 0;
padding: 0;
display: none;
}
ul li:hover ul li{
display: block;
}
对应于<body>
<header>
Html5 begins
</header>
<nav>
<ul>
<li><a href="#">div</a>
<ul>
<li>Link1.1</li>
<li>Link1.2</li>
<li>Link1.3</li>
</ul>
</li>
<li><a href="#">head</a>
<ul>
<li>Link2.1</li>
<li>Link2.2</li>
<li>Link2.3</li>
</ul>
</ul>
</nav>
</body>
的字节序列。
如果在适当的位置添加NQUZ-gBrUkSKsTGccwgrYA
,则会得到:
350519fa006b52448ab1319c73082b60
与开始时使用的已知UUID相比,字节相同,但是前3个子组中的顺序相反。
要模拟.NET的功能,您需要使用UUID.bytes_le:
UUID为16字节的字符串(以小尾数字节顺序(带有 time_low , time_mid 和 time_hi_version )。
另请参阅Why does Guid.ToByteArray() order the bytes the way it does?
答案 1 :(得分:5)
您需要使用bytes_le
来获得匹配Microsoft's的字节序:
base64.urlsafe_b64encode(uuid.UUID("fa190535-6b00-4452-8ab1-319c73082b60").bytes_le)
得到b'NQUZ-gBrUkSKsTGccwgrYA=='
。