1


2

C#でビッグ10進数を16進数に変換する方法(例:588063595292424954445828)

その数は int`よりも大きい しかし通常の `ToString`や Convert`メソッドは `Decimal`では動作しません。

4 Answer


2


私はこれが何かを返すところで正しい結果を生み出すと信じていますが、有効な整数を拒否するかもしれません。 私はそれを少しの努力で回避することができるとは敢えて言うが…​ (ああ、そして今のところ負の数でも失敗するだろう。)

静的文字列ConvertToHex(decimal d){int [] bits = decimal.GetBits(d); if(bits [3]!= 0)//符号と指数{throw new ArgumentException();} Format( "{0:x8} {1:x8} {2:x8}"、(uint)bits [2]、(uint)bits [1]、(uint)bits [0]);} stringを返します。 }


1


私はJamesに同意する必要があります - 手動で行います - しかしbase-16は使わないでください。 基数2 ^ 32を使用し、一度に8桁の16進数を印刷します。


1


1つの選択肢は、チャンクを取り除き、個々のチャンクを変換することです。 個々のフラグメントを変換するmod / divisionなどのビット

だから:あなたはどのような16進値を期待していますか?

これが2つのアプローチです。 10進数の2進構造を使用します。手動で行います。 実際には、テストが必要かもしれません:if bits [3]はゼロです、それを素早い方法で行い、それ以外は手動で行ってください。

10進数d = 588063595292424954445828M。 int [] bits = decimal.GetBits(d); if(bits [3]!= 0)は、新しいInvalidOperationException( "veのみサポートされている整数!")をスローします。文字列s = Convert.ToString(bits [2]、16).PadLeft(8、 '0')// high
            + Convert.ToString(bits[1], 16).PadLeft(8, '0') // middle
            + Convert.ToString(bits[0], 16).PadLeft(8, '0'); // low
Console.WriteLine(s);

/ *またはJonのもっときれいなもの:string.Format( "{0:x8} {1:x8} {2:x8}"、(uint)bits [2]、(uint)bits [1]、(uint)bits [ 0]); * /

const decimalチャンク=(10進数)(1 << 16); StringBuilder sb = new StringBuilder(); while(d> 0){int fragment =(int)(d%チャンク); sb.Insert(0、Convert.ToString(fragment、16).PadLeft(4、 '0')); d  -  =フラグメント。 d / =チャンクConsole.WriteLine(sb);