mirror of
https://github.com/raphaeIl/Novaria.git
synced 2025-12-13 15:04:36 +01:00
76 lines
1.9 KiB
C#
76 lines
1.9 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using System.Text;
|
|
using System.Threading.Tasks;
|
|
|
|
namespace Novaria.Common.Util
|
|
{
|
|
using System;
|
|
using System.Numerics;
|
|
|
|
public static class BigIntegerExtensions
|
|
{
|
|
public static byte[] GetBytes(this BigInteger value)
|
|
{
|
|
if (value == 0)
|
|
{
|
|
return new byte[1];
|
|
}
|
|
|
|
int bitCount = value.GetBitCount();
|
|
int byteCount = bitCount >> 3;
|
|
if ((bitCount & 7) != 0)
|
|
{
|
|
byteCount++;
|
|
}
|
|
|
|
byte[] result = new byte[byteCount];
|
|
int remainingBytes = byteCount & 3;
|
|
if (remainingBytes == 0)
|
|
{
|
|
remainingBytes = 4;
|
|
}
|
|
|
|
int byteIndex = 0;
|
|
|
|
// Convert BigInteger to unsigned equivalent (to match the behavior of the original code)
|
|
BigInteger unsignedValue = BigInteger.Abs(value);
|
|
|
|
// Iterate through each 32-bit chunk of the BigInteger
|
|
while (unsignedValue != 0)
|
|
{
|
|
uint currentWord = (uint)(unsignedValue & 0xFFFFFFFF);
|
|
unsignedValue >>= 32;
|
|
|
|
for (int i = remainingBytes - 1; i >= 0; i--)
|
|
{
|
|
result[byteIndex + i] = (byte)(currentWord & 0xFF);
|
|
currentWord >>= 8;
|
|
}
|
|
|
|
byteIndex += remainingBytes;
|
|
remainingBytes = 4;
|
|
}
|
|
|
|
return result;
|
|
}
|
|
|
|
// Helper method to calculate the number of significant bits in a BigInteger
|
|
private static int GetBitCount(this BigInteger value)
|
|
{
|
|
BigInteger unsignedValue = BigInteger.Abs(value);
|
|
int bits = 0;
|
|
|
|
while (unsignedValue != 0)
|
|
{
|
|
unsignedValue >>= 1;
|
|
bits++;
|
|
}
|
|
|
|
return bits;
|
|
}
|
|
}
|
|
|
|
}
|