【问题标题】:Is there a different way to convert to hexadecimal?有没有其他方法可以转换为十六进制?
【发布时间】:2019-05-27 06:02:00
【问题描述】:

我正在尝试将一些信息写入需要我对字符串进行编码的特殊设备,并引用“要写入的偶数字节(1-32,基数为 10)”

示例字符串提供了“DE AD BE EF CA FE”(有效)。 我已将字符串转换为十进制,从十进制转换为十六进制。

string TextToConvert = "Test Andrei";
            TextToConvert=ConvertStringToHex(TextToConvert, Encoding.UTF8);

            List<char> Chars = TextToConvert.ToCharArray().ToList();
            string CharValue = "";
            string secondHexConvert = "";
            foreach(char c in Chars)
            {
                CharValue+=Convert.ToInt32(c);
                secondHexConvert+=Convert.ToString(c, 16)+" ";
            }
            string hexValue = String.Format("{0:X}", CharValue)+" ";

我在互联网上找到了一个可以转换为十六进制的工具。问题是我不知道那是什么类型的编码。该网站是这样的:https://codebeautify.org/decimal-hex-converter 从十进制“841011151163265110100114101105”到十六进制=“a9d741e82c990000000000000”

【问题讨论】:

    标签: c#


    【解决方案1】:

    要将这么大的整数转换为十六进制字符串,请使用恰当命名的BigInteger 类型:

    var num = BigInteger.Parse("841011151163265110100114101105");
    string hex = num.ToString("X");
    Console.WriteLine(hex);
    

    将输出:

    0A9D741E82C98FC6A137B75371
    

    但这里有个问题,您在问题中显示的输出有些不同,让我将其与上面的代码生成的内容一起展示:

    0A9D741E82C98FC6A137B75371
     a9d741e82c990000000000000
    

    如您所见,数字开头相同,但您的示例以大量零结尾。

    我理解这可能发生的唯一方法是他们实际上没有使用可以容纳那么多有效数字的类型,所以你会得到一个舍入错误。

    许多动态编程语言允许您交替使用浮点数和整数,我猜这就是发生的情况,使用了只能容纳 17-18 位有效数字或类似数字的浮点类型,并且您失去了精度.但是,.NET 没有将浮点类型转换为十六进制的内置支持。

    您可以看到 .NET 通过转换回来产生了准确的值:

    Console.WriteLine(BigInteger.Parse(hex, System.Globalization.NumberStyles.HexNumber));
    

    输出:

    841011151163265110100114101105
    

    换句话说,我不确定您能否在 .NET 中获得完全相同的结果。

    推论:不要使用该网站进行此类转化!

    【讨论】:

    • 您的结论似乎准确,因为即使该站点的 hex->decimal 转换器也不会返回与输入到 decimal->hex 转换器相同的值。
    • 我已经测试了你的答案。使用这种编码,我收到一条错误消息“数据字节数必须是偶数”,我无法想象指的是什么......
    【解决方案2】:

    您可以使用以下代码将字符串转换为十六进制:

         public static string ConvertStringToHex(String input, System.Text.Encoding encoding)
        {
             Byte[] stringBytes = encoding.GetBytes(input);
            StringBuilder sbBytes = new StringBuilder(stringBytes.Length * 2);
            foreach (byte b in stringBytes)
             {
                 sbBytes.AppendFormat("{0:X2}", b);
            }
            return sbBytes.ToString();
        }
    

    您只需使用以下方式调用它:

    string testString = "11111111";
    string hex = ConvertStringToHex(testString, System.Text.Encoding.Unicode);
    

    【讨论】:

    • OP 不会将任意字符串转换为十六进制:OP 会将存储在字符串中的大数字转换为十六进制。为此,您的代码将导致“10”变为“3130”,而 OP 将期望“A”。
    猜你喜欢
    • 1970-01-01
    • 2020-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-04
    • 2012-06-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多