我正在将byte[]
转换为BigInteger
,我想确保它是正面的。 The docs say:
为防止将正值误解为负值,可以在数组末尾添加零字节值。
但它没有具体说明。那么,我该怎么做呢?
发现这是最简单的:
public static BigInteger UnsignedBigInt(byte[] bytes)
{
if ((bytes[bytes.Length - 1] & 0x80) != 0) Array.Resize(ref bytes, bytes.Length + 1);
return new BigInteger(bytes);
}
答案 0 :(得分:5)
试试这个:
byte[] bytes = ...
if ((bytes[bytes.Length - 1] & 0x80) != 0)
{
Array.Resize<byte>(ref bytes, bytes.Length + 1);
}
BigInteger result = new BigInteger(bytes);
答案 1 :(得分:4)
使用静态方法System.Array.Resize。在你的情况下:
byte[] b = Guid.NewGuid().ToByteArray();
System.Array.Resize<byte>(ref b, b.Length + 1);
b[b.Length - 1] = 0;
答案 2 :(得分:2)
var dest = new byte[17];
Array.Copy(Guid.NewGuid().ToByteArray(), dest , 16);
BigInteger bi = new BigInteger(dest);
答案 3 :(得分:1)
我认为它在页面底部进行了解释。请看一下样本:
ulong originalNumber = UInt64.MaxValue;
byte[] bytes = BitConverter.GetBytes(originalNumber);
if (originalNumber > 0 && (bytes[bytes.Length - 1] & 0x80) > 0)
{
byte[] temp = new byte[bytes.Length];
Array.Copy(bytes, temp, bytes.Length);
bytes = new byte[temp.Length + 1];
Array.Copy(temp, bytes, temp.Length);
}
BigInteger newNumber = new BigInteger(bytes);
Console.WriteLine("Converted the UInt64 value {0:N0} to {1:N0}.",
originalNumber, newNumber);
请注意,此代码是从MSDN网站复制的,以显示如何处理在转换为BigInt期间可能被视为负数的大数字。在效率方面,这不是而不是你能得到的最好的东西,并且在这个帖子中提供了更好的片段。
答案 4 :(得分:1)
这看起来很简单:
var bytesAfter = bytesBefore.Concat(new byte[] { 0 }).ToArray();
答案 5 :(得分:0)
一种方式:
var x = BigInteger.Abs(new BigInteger(bytes));