如何将大十进制数转换为C#中的十六进制数(例如:588063595292424954445828)

如何将大十进制数转换为C#中的十六进制数(例如:588063595292424954445828),c#,decimal,hex,type-conversion,C#,Decimal,Hex,Type Conversion,该数字大于int和long,但可以容纳在十进制中。但是正常的ToString或Convert方法不适用于Decimal手动执行 手动操作 我必须同意詹姆斯的意见-手动操作-但不要使用base-16。使用base 2^32,一次打印8个十六进制数字。我必须同意James的意见-手动操作-但不要使用base-16。使用基数2^32,一次打印8个十六进制数字。我想一个选择是继续从中取出块,然后转换单个块?一点mod/division等,转换单个片段 那么:你期望什么十六进制值 这里有两种方法。。。一种

该数字大于
int
long
,但可以容纳在
十进制中。但是正常的
ToString
Convert
方法不适用于
Decimal

手动执行

手动操作


我必须同意詹姆斯的意见-手动操作-但不要使用base-16。使用base 2^32,一次打印8个十六进制数字。

我必须同意James的意见-手动操作-但不要使用base-16。使用基数2^32,一次打印8个十六进制数字。

我想一个选择是继续从中取出块,然后转换单个块?一点mod/division等,转换单个片段

那么:你期望什么十六进制值

这里有两种方法。。。一种是使用十进制的二进制结构;一个是手工做的。实际上,您可能需要进行一次测试:如果位[3]为零,请快速执行,否则请手动执行

    decimal d = 588063595292424954445828M;
    int[] bits = decimal.GetBits(d);
    if (bits[3] != 0) throw new InvalidOperationException("Only +ve integers supported!");
    string 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);

    /* or Jon's much tidier: string.Format("{0:x8}{1:x8}{2:x8}",
            (uint)bits[2], (uint)bits[1], (uint)bits[0]);  */

    const decimal chunk = (decimal)(1 << 16);
    StringBuilder sb = new StringBuilder();
    while (d > 0)
    {
        int fragment = (int) (d % chunk);
        sb.Insert(0, Convert.ToString(fragment, 16).PadLeft(4, '0'));
        d -= fragment;
        d /= chunk;
    }
    Console.WriteLine(sb);
十进制d=588063595292424954445828M;
int[]位=十进制.GetBits(d);
如果(位[3]!=0)抛出新的InvalidOperationException(“仅支持+ve个整数!”);
字符串s=Convert.ToString(位[2],16).PadLeft(8,'0')//高
+Convert.ToString(位[1],16).PadLeft(8,'0')//中间
+转换.ToString(位[0],16).PadLeft(8,'0');//低的
控制台。写入线(s);
/*或者Jon的更整洁的:string.Format(“{0:x8}{1:x8}{2:x8}”,
(uint)位[2],(uint)位[1],(uint)位[0]*/
常量十进制块=(十进制)(1 0)
{
int片段=(int)(d%块);
sb.Insert(0,Convert.ToString(fragment,16).PadLeft(4,'0');
d-=片段;
d/=块;
}
(某人);

我想一个选择是不断地从它上面去掉块,然后转换单个块?一点mod/division等,转换单个片段

那么:你期望什么十六进制值

这里有两种方法。。。一种是使用十进制的二进制结构;一个是手工做的。实际上,您可能需要进行一次测试:如果位[3]为零,请快速执行,否则请手动执行

    decimal d = 588063595292424954445828M;
    int[] bits = decimal.GetBits(d);
    if (bits[3] != 0) throw new InvalidOperationException("Only +ve integers supported!");
    string 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);

    /* or Jon's much tidier: string.Format("{0:x8}{1:x8}{2:x8}",
            (uint)bits[2], (uint)bits[1], (uint)bits[0]);  */

    const decimal chunk = (decimal)(1 << 16);
    StringBuilder sb = new StringBuilder();
    while (d > 0)
    {
        int fragment = (int) (d % chunk);
        sb.Insert(0, Convert.ToString(fragment, 16).PadLeft(4, '0'));
        d -= fragment;
        d /= chunk;
    }
    Console.WriteLine(sb);
十进制d=588063595292424954445828M;
int[]位=十进制.GetBits(d);
如果(位[3]!=0)抛出新的InvalidOperationException(“仅支持+ve个整数!”);
字符串s=Convert.ToString(位[2],16).PadLeft(8,'0')//高
+Convert.ToString(位[1],16).PadLeft(8,'0')//中间
+转换.ToString(位[0],16).PadLeft(8,'0');//低的
控制台。写入线(s);
/*或者Jon的更整洁的:string.Format(“{0:x8}{1:x8}{2:x8}”,
(uint)位[2],(uint)位[1],(uint)位[0]*/
常量十进制块=(十进制)(1 0)
{
int片段=(int)(d%块);
sb.Insert(0,Convert.ToString(fragment,16).PadLeft(4,'0');
d-=片段;
d/=块;
}
(某人);

我相信这将产生正确的结果,返回任何内容,但可能会拒绝有效的整数。我敢说,这可以通过一点努力来解决。。。(哦,现在对于负数它也会失败。)


我相信这将产生正确的结果,返回任何内容,但可能拒绝有效的整数。我敢说,这可以通过一点努力来解决。。。(哦,现在对于负数它也会失败。)


我期望的值是:7c86fdcb000000000004Marc:我们显然又有了相似的想法,尽管我希望我的格式化代码稍微简单一些——如果慢一些的话。我想知道解决“整数失败”问题有多容易。我们真的需要一个十进制的规范化方法:(Normalize…嗯,更改比例(通过GetBits())很简单-只需要检查它是否是整数afterwads(或使用Floor/shipped)…如果你有某种通用库可以承载这样的方法…@MarcGravell:
十进制规范化(这个十进制v){return v/1.000000000000000000000000000000000000m;}
可以很好地工作。我希望值是:7C86FDCB00000000000000004MARC:我们显然又是这么想的,尽管我想我的格式化代码稍微简单一些——如果慢一些的话。我想知道修复“某些整数失败”有多容易问题。我们真的需要一个十进制的规范化方法:(Normalize…嗯,更改比例(通过GetBits())很简单-只需要检查它是否是一个整数(或使用Floor/天花)…如果你有某种通用库可以承载这样的方法…@MarcGravell:
decimal Normalize(这个十进制v){返回v/1.00000000000000000000000000000M;}
可以很好地工作,我手边没有现成的婴儿床表!这不仅仅是负数-对于任何非零刻度的整数,例如100.00M,它都可能失败。我们的想法是一样的,我想在这种情况下,协议缓冲区与此有很大关系;-pI也没有我的婴儿床表,但直到它工作之前我一直猜测:)我必须考虑一种十进制的标准化方法。这应该没那么难……好吧,我手头没有现成的婴儿床表!这不仅仅是负数——对于任何非零刻度的整数,例如100.00M,它都可能失败。我们的想法是一样的,我想在这种情况下,协议缓冲区与此有很大关系;-pI没有我的婴儿床我也不知道,但我一直在猜测,直到它起作用:)我必须考虑一个十进制的规范化方法。它应该不会那么难。。。