乌龙.解析(字符串,数字样式)异常 C#

本文关键字:样式 异常 数字 解析 字符串 乌龙 | 更新日期: 2023-09-27 18:36:02

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

我已经在互联网上搜索了解决方案,但似乎没有任何工作要做。

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) 采用字符串并返回其十六进制表示形式。

但我不断得到的只是"输入字符串格式不正确"。解析(字符串,数字样式);无论我的输入是什么,我都会不断收到"格式异常"输入字符串格式不正确"。错误。

输入及其输出

  1. 字符串:格式异常 - "你好"
  2. 十六进制:格式异常 - "48 65 6C 6C 6F"
  3. byte[]:格式异常 - { 72, 101, 108, 108, 111 }
  4. 我也尝试使用"Hello"字符串,但它给我带来了同样的错误。

你能告诉我我在这里做错了什么吗?我也尝试过"清理/构建/重建"重新启动Visual Studio,但我不断收到相同的格式异常。

编辑,,使用 UInt64.Parse() 不长。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);
当前文化设置为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]);
            }
        }

最后一个是检查解决方案。

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

乌龙.解析(字符串,数字样式)异常 C#

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

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

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

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

奖励答案。

如果您不太关心性能,甚至可以使用 LINQ 单行代码:

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