向字节数组添加零字节最简单的方法是什么?

时间:2012-09-06 02:48:08

标签: c#

我正在将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);
}

Thanks dtb

6 个答案:

答案 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));
相关问题