将128位带符号的BigInteger移位为始终为正

时间:2011-05-26 16:17:18

标签: c# biginteger

我正在将Guid转换为BigInteger,因此我可以对其进行base62编码。这很好,但是,我可以在BigInterger中得到负数。如何移动BigInteger以使数字为正数。我还需要能够将它移回去,以便我可以转换回Guid。

// GUID is a 128-bit signed integer 
Guid original = new Guid("{35db5c21-2d98-4456-88a0-af263ed87bc2}");
BigInteger b = new BigInteger(original.ToByteArray());

// shift so its a postive number?

4 个答案:

答案 0 :(得分:2)

注意:对于Base64的url-safe版本,请考虑使用Base64(http://en.wikipedia.org/wiki/Base64#URL_applications)的修改字符集而不是自定义Base62。

我相信你可以先向数组追加0(最高位会使最高字节不包含1)然后如果你真的需要正BigInteger则转换为BigInteger。

答案 1 :(得分:0)

你的意思是base64编码吗?

Convert.ToBase64String(Guid.NewGuid().ToByteArray());

答案 2 :(得分:0)

如果有时会得到负数,则意味着您的GUID值足以填充BigInteger的所有128位,否则BigInteger byte [] ctor正在解释数据。为确保您的字节实际为正,请检查您是否获得&lt; = 16字节(128位)并且最后一个字节的最高有效位(因为它的小端)为零。如果你有<16字节,你可以简单地append a zero byte to your array(再次,因为它是小端而附加,以确保BigInteger ctor将其视为正数。)

答案 3 :(得分:0)

article我认为它可以为您提供解决方案: 总而言之,如果最后一个字节的最高有效位是1,则将另外一个字节加到0。

FutureWarning