如何将一个gi-正常的整数(以string格式)转换为hex格式? (C#)

给定一个潜在的巨大的整数值(以C#string格式),我想能够产生其hex等值。 正常的方法不适用于这里,因为我们正在任意大数字,50个数字或更多。 我见过的技术使用这样的技术:

// Store integer 182 int decValue = 182; // Convert integer 182 as a hex in a string variable string hexValue = decValue.ToString("X"); // Convert the hex string back to the number int decAgain = int.Parse(hexValue, System.Globalization.NumberStyles.HexNumber); 

将不起作用,因为要转换的整数太大。

例如,我需要能够像这样转换一个string:

843370923007003347112437570992242323

到其hex等值。

这些不起作用:

C#将整数转换为hex,然后再回来 如何转换hex和十进制之间的数字在C#?

哦,那很简单:

  var s = "843370923007003347112437570992242323"; var result = new List<byte>(); result.Add( 0 ); foreach ( char c in s ) { int val = (int)( c - '0' ); for ( int i = 0 ; i < result.Count ; i++ ) { int digit = result[i] * 10 + val; result[i] = (byte)( digit & 0x0F ); val = digit >> 4; } if ( val != 0 ) result.Add( (byte)val ); } var hex = ""; foreach ( byte b in result ) hex = "0123456789ABCDEF"[ b ] + hex; 

使用BigInteger存储整数,并使用该对象上的.ToString(“X”) 。

例:

 var number = BigInteger.Parse("843370923007003347112437570992242323"); string hexValue = number.ToString("X"); 

但是,这仅限于.NET 4及更高版本。 但是Jens A. 在codeproject上指向一个BigInteger类 ,该类包含一个名为ToHexString的方法,因此可以用于<.NET 4scheme。

正如Jens所说,看看代码项目的BigInt实现。 即使他们没有一个函数转换为hex,你可以很容易地写一个函数来自己动手,只要这个BigInt有一个除法和模运算(我不认为它有模函数,所以你会也需要自己写模 )

嘿很好的解决schemedec < – >hex转换这里在stackoverflow到目前为止,但我需要(巨大的int。硕大分数)几乎没有任何精度损失,所以我改变了我find的所有代码,我已经完成的代码,这里是一些我可以分享(没有大的int /真正的lib使用)

 //--------------------------------------------------------------------------- AnsiString str_hex2dec(const AnsiString &hex) { char c; AnsiString dec="",s; int i,j,l,ll,cy,val; int i0,i1,i2,i3,sig; sig=+1; l=hex.Length(); if (l) { c=hex[l]; if (c=='h') l--; if (c=='H') l--; } i0=0; i1=l; i2=0; i3=l; for (i=1;i<=l;i++) // scan for parts of number { char c=hex[i]; if (c=='-') sig=-sig; if ((c=='.')||(c==',')) i1=i-1; if ((c>='0')&&(c<='9')) { if (!i0) i0=i; if ((!i2)&&(i>i1)) i2=i; } if ((c>='A')&&(c<='F')) { if (!i0) i0=i; if ((!i2)&&(i>i1)) i2=i; } if ((c>='a')&&(c<='f')) { if (!i0) i0=i; if ((!i2)&&(i>i1)) i2=i; } } l=0; s=""; if (i0) for (i=i0;i<=i1;i++) { c=hex[i]; if ((c>='0')&&(c<='9')) c-='0'; else if ((c>='A')&&(c<='F')) c-='A'-10; else if ((c>='a')&&(c<='f')) c-='A'-10; for (cy=c,j=1;j<=l;j++) { val=(s[j]<<4)+cy; s[j]=val%10; cy =val/10; } while (cy>0) { l++; s+=char(cy%10); cy/=10; } } if (s!="") { for (j=1;j<=l;j++) { c=s[j]; if (c<10) c+='0'; else c+='A'-10; s[j]=c; } for (i=l,j=1;j<i;j++,i--) { c=s[i]; s[i]=s[j]; s[j]=c; } dec+=s; } if (dec=="") dec="0"; if (sig<0) dec="-"+dec; if (i2) { dec+='.'; s=hex.SubString(i2,i3-i2+1); l=s.Length(); for (i=1;i<=l;i++) { c=s[i]; if ((c>='0')&&(c<='9')) c-='0'; else if ((c>='A')&&(c<='F')) c-='A'-10; else if ((c>='a')&&(c<='f')) c-='A'-10; s[i]=c; } ll=((l*1234)>>10); // num of decimals to compute for (cy=0,i=1;i<=ll;i++) { for (cy=0,j=l;j>=1;j--) { val=s[j]; val*=10; val+=cy; s[j]=val&15; cy=val>>4; } dec+=char(cy+'0'); for (;;) { if (!l) break;; if (s[l]) break; l--; } if (!l) break;; } } return dec; } //--------------------------------------------------------------------------- AnsiString str_dec2hex(AnsiString dec) { AnsiString hex=""; BYTE a,b; int i,j,i0,i1,i2,i3,l,sig; sig=+1; l=dec.Length(); i0=0; i1=l; i2=0; i3=l; for (i=1;i<=l;i++) // scan for parts of number { char c=dec[i]; if (c=='-') sig=-sig; if ((c=='.')||(c==',')) i1=i-1; if ((c>='0')&&(c<='9')) { if (!i0) i0=i; if ((!i2)&&(i>i1)) i2=i; } } if (i0) for (;i1>=i0;i1=j-1)// process integer part /16 { for (a=0,j=i0,i=i0;i<=i1;i++) { a*=10; a+=dec[i]-'0'; if (a<16) { if (j>i0){ dec[j]='0'; j++; } continue; } b=a>>4; a=a&15; if (b>10) { dec[j]='1'; j++; b-=10; } dec[j]=b+'0'; j++; } if ((!a)&&(hex=="")) continue; if (a<10) a+='0'; else a+='A'-10; hex=AnsiString(char(a))+hex; } if (hex=="") hex="0"; if ((i2)&&(i2<=i3)) // process fractional part *16 for (hex+=".",j=i3-i2+2;j;j--) { for (a=0,b=0,i=i3;i>=i2;i--) { a=dec[i]-'0'; b+=a<<4; dec[i]=(b%10)+'0'; b/=10; } if (b<10) b+='0'; else b+='A'-10; hex+=char(b); } if (sig<0) hex="-"+hex; hex+="h"; return hex; } //--------------------------------------------------------------------------- 

PS如果您需要切断小数位(以格式化数字),则必须切割切割部分的最高位数。

  • 如果数字> =“5”,则在十进制模式下将四舍五入取整
  • 如果数字> =“8”,则以hex模式向上取整

如果你想知道这条线是什么意思:

 ll=((l*1234)>>10); // num of decimals to compute 

比计算匹配inputstring精度的小数位数(每hex小数位数为1.205十进制小数)。 这个比例我得到的准确性经验测量高达1280位每个小数部分的数字。 为了简单起见1e-l可以以最大误差存储到1e-(l + 1)。 这个比例几乎是恒定的(除了低位小数值(<16位),所以这个公式可以安全地用于任何数量较大的数字。在低位input数字值输出错误最大1(> 8位)或最大2 (<= 8位数字)位