نوشته شده توسط
behnia_k
منظورم تبدیل رشته های در مبنای 16 به
BigInteger
هستش که هنگام تیدیل رشتخ هایی که اولین رقم سمت چپ آن از 7 بزرگتر باشد عدد را منقی در نظر میگیرد مثلا "C" برابر 12 نمی شود (امکان نابلد بودن من هست).
متاسفانه System.Numeric.BigInteger داده ورودی رو علامت دار در نظر میگیره، این رو نمیشه کاری کرد.
اما میدونیم داخل کلاسش یک متد سازنده private داره که []uint قبول می کنه (که چون private ئه در حالت عادی بهش دسترسی نداریم)
و میدونیم خود کلاسش هم عدد رو در یک فیلد private uint[] _data نگه میداره که مستقیما از همون متد سازنده داده میگیره.
پس میتونیم با کمک System.Reflection از اون متد سازنده private استفاده کنیم و داده بدون علامت رو بزور داخل شیء BigInteger تزریق کنیم:
using System.Numerics;
using System.Reflection;
private static BigInteger HexToBigInteger( string hex)
{
if ( hex.Trim( '0').Length == 0)
{
return BigInteger.Zero;
}
hex = '0' + hex.TrimStart( '0');
hex = hex.PadLeft( ( ( hex.Length + 7) / 8) * 8, '0');
var data = new uint[hex.Length / 8];
var pos = data.Length - 1;
for ( var index = 0; index < hex.Length; index += 8, pos--)
{
data[pos] = Convert.ToUInt32( hex.Substring( index, 8), 16);
}
var constructorInfo = typeof( BigInteger).GetConstructor( BindingFlags.NonPublic | BindingFlags.Instance, null, new Type[] { typeof( int), typeof( uint[]) }, null);
return (BigInteger) constructorInfo.Invoke( new object[] { 1, data });
}
مثلا :
var hex = "FF";
var n1 = BigInteger.Parse( hex, System.Globalization. NumberStyles.HexNumber);
var n2 = HexToBigInteger( hex);
MessageBox.Show( "n1=" + n1 + Environment.NewLine + "n2=" + n2);
var hex = "C23B56789AE34";
var n1 = BigInteger.Parse( hex, System.Globalization. NumberStyles.HexNumber);
var n2 = HexToBigInteger( hex);
MessageBox.Show( "n1=" + n1 + Environment.NewLine + "n2=" + n2);