4

私はabyte[]をaに変換していて、BigIntegerそれが確実にポジティブになるようにしたいのです。ドキュメントは言う

正の値が負の値として誤って解釈されるのを防ぐために、配列の最後にゼロバイトの値を追加できます。

しかし、それは方法を指定していません。だから、どうすればこれを行うことができますか?


これが最も簡単であることがわかりました:

public static BigInteger UnsignedBigInt(byte[] bytes)
{
    if ((bytes[bytes.Length - 1] & 0x80) != 0) Array.Resize(ref bytes, bytes.Length + 1);
    return new BigInteger(bytes);
}

ありがとうdtb

4

6 に答える 6

5

これを試して:

byte[] bytes = ...

if ((bytes[bytes.Length - 1] & 0x80) != 0)
{
    Array.Resize<byte>(ref bytes, bytes.Length + 1);
}

BigInteger result = new BigInteger(bytes);
于 2012-09-06T03:05:23.973 に答える
4

静的メソッドSystem.Array.Resizeを使用します。あなたの場合:

byte[] b = Guid.NewGuid().ToByteArray();
System.Array.Resize<byte>(ref b, b.Length + 1);
b[b.Length - 1] = 0;
于 2012-09-06T03:06:05.183 に答える
2
var dest = new byte[17];
Array.Copy(Guid.NewGuid().ToByteArray(), dest , 16);
BigInteger bi = new BigInteger(dest);
于 2012-09-06T03:08:55.330 に答える
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);

BigIntへの変換中に負の数として扱われる可能性のある大きな数を処理する方法を示すために、このコードはMSDNサイトからコピーされていることに注意してください。効率に関しては、これはあなたが得ることができる最高のものではなく、このスレッドで提供されるはるかに優れたスニペットがあります。

于 2012-09-06T03:01:15.047 に答える
1

これはかなり単純なようです:

var bytesAfter = bytesBefore.Concat(new byte[] { 0 }).ToArray();
于 2012-09-06T03:15:42.927 に答える
0

一方通行:

var x = BigInteger.Abs(new BigInteger(bytes));
于 2012-09-06T03:06:36.297 に答える