【问题标题】:C# not supported ulong to bin/oct/dec/hex string -> Convert.ToString(ulong, base)C# 不支持 ulong 到 bin/oct/dec/hex 字符串 -> Convert.ToString(ulong, base)
【发布时间】:2016-03-15 11:05:10
【问题描述】:

我会将 ulong 值的 bin/oct/dec/hex 值作为字符串。所以我必须使用 convert.tostring(, base) 和所需的基础。为了支持这一点,我将 ulong 值转换为 long,而 convert.tostring(, base) 支持 long 以将 bin/oct/dec/hex 值作为 ulong 的字符串。我对吗?

//while Convert.ToString does not support ulong with base
//Convert.ToString(ulong.MaxValue, 2);

// following code sample is the same like not supported ToString on line 2, right? 
ulong ul = ulong.Maxvalue; 
long l = (long)ul;
Convert.ToString(l, 8); //8 => oct, 2 => bin

好的,对于 dec,我可以使用 ul.ToString(); 对于十六进制,ul.ToString("X");

基于Copy bits from ulong to long in C# 我有点困惑。这是否为我提供了 ulong 的正确 Oct 和 Bin 字符串表示?

相关要点: https://gist.github.com/chubbson/375b535243c166d28119

【问题讨论】:

  • 您不能将 MaxValue 从 ulong 转换为 long。
  • MaxValue 只是一个例子,它可以是任何 ulong 值。我知道有符号和无符号的值不同,但是十六进制八进制和二进制表示应该相同还是我错了?
  • 应该是一样的
  • 向 UInt64 写一个扩展方法,使用 string.Format 输出值而不是依赖于 Convert。

标签: c# string bin octal ulong


【解决方案1】:

只要您要转换的类型没有负数的概念,您的转换过程就应该有效,因此您应该安全地执行除 10 之外的所有基数。

public static void Main()
{
    ulong ul = ulong.MaxValue; 
    long l = (long)ul;
    var s = Convert.ToString(l, 8); //8 => oct, 2 => bin
    Console.WriteLine(s); //Outputs 1777777777777777777777
}

https://dotnetfiddle.net/fsoIkw

【讨论】:

    【解决方案2】:

    Convert.ToString 只允许对 byte、int、short 和 long 类型进行基本转换。 跟随 BasedValueConverter 允许 bin/oct/dec/hex 表示 byte、sbyte、short、ushort、int、uint、long、ulong。

    检查相关的 https://gist.github.com/chubbson/375b535243c166d28119 以获取 BasedValueConverter 类的实现。 这是输出(LinqpadScript):

    BasedValueConverter bvc;
    bvc = new BasedValueConverter(byte.MaxValue.Dump("BasedValueConverter byte"));
    bvc.ToStringBin().Dump();  // 11111111
    bvc.ToStringOct().Dump();  // 377
    bvc.ToStringDec().Dump();  // 255
    bvc.ToStringHex().Dump();  // FF
    
    bvc = new BasedValueConverter(byte.MinValue);
    bvc.ToStringBin().Dump();  // 00000000
    bvc.ToStringOct().Dump();  // 000
    bvc.ToStringDec().Dump();  // 000
    bvc.ToStringHex().Dump();  // 00
    
    
    
    bvc = new BasedValueConverter(sbyte.MaxValue.Dump("BasedValueConverter sbyte"));
    bvc.ToStringBin().Dump();  // 01111111
    bvc.ToStringOct().Dump();  // 177
    bvc.ToStringDec().Dump();  // 127
    bvc.ToStringHex().Dump();  // 7F
    
    bvc = new BasedValueConverter((sbyte)-1);
    bvc.ToStringBin().Dump();  // 11111111
    bvc.ToStringOct().Dump();  // 377
    bvc.ToStringDec().Dump();  // -001
    bvc.ToStringHex().Dump();  // FF
    
    
    
    bvc = new BasedValueConverter(short.MaxValue.Dump("BasedValueConverter short"));
    bvc.ToStringBin().Dump();  // 0111111111111111
    bvc.ToStringOct().Dump();  // 077777 
    bvc.ToStringDec().Dump();  // 32767
    bvc.ToStringHex().Dump();  // 7FFF
    
    bvc = new BasedValueConverter((short)-1);
    bvc.ToStringBin().Dump();  // 1111111111111111
    bvc.ToStringOct().Dump();  // 177777
    bvc.ToStringDec().Dump();  // -00001
    bvc.ToStringHex().Dump();  // FFFF
    
    
    
    bvc = new BasedValueConverter(ushort.MaxValue.Dump("BasedValueConverter ushort"));
    bvc.ToStringBin().Dump();  // 1111111111111111
    bvc.ToStringOct().Dump();  // 177777
    bvc.ToStringDec().Dump();  // 65535
    bvc.ToStringHex().Dump();  // FFFF
    
    bvc = new BasedValueConverter(ushort.MinValue);
    bvc.ToStringBin().Dump();  // 0000000000000000
    bvc.ToStringOct().Dump();  // 000000
    bvc.ToStringDec().Dump();  // 00000
    bvc.ToStringHex().Dump();  // 0000
    
    
    
    bvc = new BasedValueConverter(int.MaxValue.Dump("BasedValueConverter int"));
    bvc.ToStringBin().Dump();  // 01111111111111111111111111111111
    bvc.ToStringOct().Dump();  // 17777777777
    bvc.ToStringDec().Dump();  // 2147483647
    bvc.ToStringHex().Dump();  // 7FFFFFFF
    
    bvc = new BasedValueConverter((int)-1);
    bvc.ToStringBin().Dump();  // 11111111111111111111111111111111
    bvc.ToStringOct().Dump();  // 37777777777
    bvc.ToStringDec().Dump();  // -0000000001
    bvc.ToStringHex().Dump();  // FFFFFFFF
    
    
    
    bvc = new BasedValueConverter(uint.MaxValue.Dump("BasedValueConverter uint"));
    bvc.ToStringBin().Dump();  // 11111111111111111111111111111111
    bvc.ToStringOct().Dump();  // 37777777777
    bvc.ToStringDec().Dump();  // 4294967295
    bvc.ToStringHex().Dump();  // FFFFFFFF
    
    bvc = new BasedValueConverter(uint.MinValue);
    bvc.ToStringBin().Dump();  // 00000000000000000000000000000000
    bvc.ToStringOct().Dump();  // 00000000000
    bvc.ToStringDec().Dump();  // 0000000000
    bvc.ToStringHex().Dump();  // 00000000
    
    
    
    bvc = new BasedValueConverter(long.MaxValue.Dump("BasedValueConverter long"));
    bvc.ToStringBin().Dump();  // 0111111111111111111111111111111111111111111111111111111111111111
    bvc.ToStringOct().Dump();  // 0777777777777777777777
    bvc.ToStringDec().Dump();  // 9223372036854775807
    bvc.ToStringHex().Dump();  // 7FFFFFFFFFFFFFFF
    
    bvc = new BasedValueConverter((long)-1);
    bvc.ToStringBin().Dump();  // 1111111111111111111111111111111111111111111111111111111111111111
    bvc.ToStringOct().Dump();  // 1777777777777777777777
    bvc.ToStringDec().Dump();  // -00000000000000000001
    bvc.ToStringHex().Dump();  // FFFFFFFFFFFFFFFF
    
    
    
    bvc = new BasedValueConverter(ulong.MaxValue.Dump("BasedValueConverter ulong"));
    bvc.ToStringBin().Dump();  // 1111111111111111111111111111111111111111111111111111111111111111
    bvc.ToStringOct().Dump();  // 1777777777777777777777
    bvc.ToStringDec().Dump();  // -00000000000000000001
    bvc.ToStringHex().Dump();  // FFFFFFFFFFFFFFFF
    
    bvc = new BasedValueConverter(ulong.MinValue);
    bvc.ToStringBin().Dump();  // 0000000000000000000000000000000000000000000000000000000000000000
    bvc.ToStringOct().Dump();  // 0000000000000000000000
    bvc.ToStringDec().Dump();  // 00000000000000000000
    bvc.ToStringHex().Dump();  // 0000000000000000
    

    【讨论】:

      猜你喜欢
      • 2016-02-25
      • 1970-01-01
      • 1970-01-01
      • 2011-04-10
      • 1970-01-01
      • 2011-05-15
      • 1970-01-01
      • 1970-01-01
      • 2015-06-21
      相关资源
      最近更新 更多