ulong.Parse(string,NumberStyles)异常C#

时间:2015-01-04 09:30:10

标签: c# parsing formatexception

我一直在研究这种“字符串到二进制”的方法比平时更长,我不知道我哪里出错了。

我已经在互联网上寻找解决方案,但似乎没有按照预期的方式工作。

public static string hexToBin(string strValue)
    {
        byte[] hexThis = ASCIIEncoding.ASCII.GetBytes(strValue.ToString());

        string thiI = ToHex(strValue);
        ulong number = UInt64.Parse(*string*, System.Globalization.NumberStyles.HexNumber);

        byte[] bytes = BitConverter.GetBytes(number);

        string binaryString = string.Empty;
        foreach (byte singleByte in bytes)
        {
            binaryString += Convert.ToString(singleByte, 2);
        }

        return binaryString;
    }

ToHex(string)接受字符串并返回其十六进制表示。

但我不断得到的是“输入字符串格式不正确”。在ulong.Parse(string,NumberStyle);并且无论我的输入是什么,我都会得到“FormatException”“输入字符串的格式不正确。”错误。

输入及其输出

  1. string:格式异常 - “Hello”
  2. hex:格式例外 - “48 65 6C 6C 6F”
  3. byte []:格式异常 - {72,101,108,108,111}
  4. 我也试过使用“Hello”字符串,但它给我带来了同样的错误。
  5. 你能不能让我知道我在这里做错了什么? 我也试过“清理/构建/重建”重启visual studio,但我一直得到相同的格式异常。

    编辑,使用UInt64.Parse()而不是ulong.Parse(),使用的字符串是“Hello”,没有引号。

    编辑#2 ,,

    所以我根据knittl建议做了这个,并使用Convert.ToUInt64而不是解析,但仍然得到相同的错误

            ulong binary;
            string binThis;
            byte[] ByteThis;
    
            binThis = "Hello";
    
            ByteThis = ASCIIEncoding.ASCII.GetBytes(binThis);
    
            binary = Convert.ToUInt64(ByteThis);
    
            Console.WriteLine(binary);
    

    CurrentCulture设置为en-US,我也使用en-US键盘

    编辑#3 - 解决了

    感谢knittl

    解决方案如下:

            string thestring = "example";
            string[] finale = new string[thestring.Length];
    
            foreach (var c in ByteThis)
            {
                for (int i = 0; i < ByteThis.Length; i++)
                {
                    thestring = Convert.ToString(c, 2);
                    thestring = "0" + thestring;
                    if (thestring.Length == 9)
                        thestring.Remove(0, 1);
                    finale[i] = thestring;
                    Console.WriteLine(finale[i]);
                }
            }
    

    最后的决定是检查解决方案。

    这个问题旨在获得给定字符串的二进制表示。

2 个答案:

答案 0 :(得分:1)

不完全清楚,你的方法应该做什么(即输入字符串是什么格式。是bas10号码,还是十六进制数?)

如果它是十六进制数字,请使用ulong.Parse(inputStr, NumberStyles.HexNumber)。如果没有,只需使用ulong.Parse(inputStr)即可。请注意,NumberStyles.HexNumber 允许使用0x前缀(Convert.ToUInt64(inputStr))。

然后,一旦您将输入字符串解析为数字,只需使用Convert.ToString(number, 2)转换为base2。您会注意到没有重载需要ulongint,但您可以简单地将您的数字转换为(签名)长,因为二进制表示在两者之间是相同的(cf两个补充)。所以,实际上是Convert.ToString((long)number, 2)

无需复杂的循环和转换为字节数组。

答案 1 :(得分:0)

奖金回答。

如果你不太关心性能,你甚至可以使用LINQ one-liner:

Encoding.ASCII.GetBytes(inputStr).Aggregate(
  new StringBuilder(),
  (sb, ch) => sb.Append(Convert.ToString(ch, 2).PadLeft(8, '0')),
  sb => sb.ToString());