当前位置: 首页 > 知识库问答 >
问题:

将“大”十六进制数(字符串格式)转换为十进制数(字符串格式),而不使用 BigInteger 类

岳玉堂
2023-03-14

如何转换“大”十六进制数(字符串格式):

EC 851 A 69 B 8 ACD 843164 E 10 CFF 70 CF 9 E 86 DC 2 FEE 3 CF 6 F 374 B 43 C 854 E 3342 A 2 F 1 AC 3 E 30 C 741 CC 41 E 679 DF 6 D 07 CE 6 FA 3 A 66083 EC 9 B 8 C 8 BF 3 AF 05 D 8 BDB B 0 A 6 CB 3 EF 8 C 5 BAA 2 A 5 E 531 BA 9 E 28592 F 99 E 0 FE 4 F 95169 A 6 C 63 F 635 D 0197 E 325 C 5 EC 76219 B 907 E 4 EB DCD 401 FB 1986 E 4 E 3 CA 661 FF 73 E 7 E 2 B 8 FD 9988 E 753 B 7042 B 2 BBC A 76679

转换为十进制数(字符串格式):

166089946137986168535368849184301740204613753693156360462575217560130904921953976324839782808018277000296027060873747803291797869684516494894741699267674246881622658654267131250470956587908385447044319923040838072975636163137212887824248575510341104029461758594855159174329892125993844566497176102668262139513

而不使用 BigInteger 类(因为我的应用程序应该支持没有 .NET Framework 4 的计算机)?

共有3个答案

牛骞仕
2023-03-14

您可以使用IntX库,因为它应该与.Net 2.0及更高版本一起使用。根据页面上关于<code>BigInteger</code>的描述:

所以在系统内部。Numerics.BigInteger似乎使用标准的任意算术算法,我不担心IntX库,因为,由于它使用了FHT,它可以比真正的大整数快几倍。

许可证是相当自由的,但值得先阅读,以确保它是好的。

我没有使用过这个库,但是粗略地看一下源代码,这应该就是你需要做的全部了

string dec = new IntX(myHex, 16).ToString();

如果不想自己编译代码,可以通过 Nuget 进行安装

景德海
2023-03-14

我刚把道格拉斯的代码翻译成VBA

Function HexToDecimal(ByVal sHex As String) As String

    Dim dec() As Long
    ReDim dec(0 To 0) As Long

    Dim lCharLoop As Long
    For lCharLoop = 1 To Len(sHex)

        Dim char As String * 1
        char = Mid$(sHex, lCharLoop, 1)

        Dim carry As Long
        carry = Val("&h" & char)

        Dim i As Long
        For i = 0 To UBound(dec)
            Dim lVal As Long
            lVal = dec(i) * 16 + carry
            dec(i) = lVal Mod 10
            carry = lVal \ 10
        Next i

        While (carry > 0)
            ReDim Preserve dec(0 To UBound(dec) + 1) As Long
            dec(UBound(dec)) = carry Mod 10
            carry = carry \ 10
        Wend
    Next

    For lCharLoop = UBound(dec) To LBound(dec) Step -1
        Dim sDecimal As String
        sDecimal = sDecimal & Chr$(48 + dec(lCharLoop))

    Next

    HexToDecimal = sDecimal

End Function

Private Sub TestHexToDecimal()

    Debug.Assert HexToDecimal("F") = "15"
    Debug.Assert HexToDecimal("4") = CStr(Val("&H4"))
    Debug.Assert HexToDecimal("10") = CStr(Val("&H10"))
    Debug.Assert HexToDecimal("20") = CStr(Val("&H20"))
    Debug.Assert HexToDecimal("30") = CStr(Val("&H30"))
    Debug.Assert HexToDecimal("40") = CStr(Val("&H40"))
    Debug.Assert HexToDecimal("44") = CStr(Val("&H44"))
    Debug.Assert HexToDecimal("FF") = "255"
    Debug.Assert HexToDecimal("FFF") = "4095"
    Debug.Assert HexToDecimal("443") = CStr(Val("&H443"))
    Debug.Assert HexToDecimal("443C1") = "279489"
    Debug.Assert HexToDecimal("443C1CE20DFD592FB374D829B894BBE5") = "90699627342249584016268008583970733029"

    Debug.Assert HexToDecimal("EC851A69B8ACD843164E10CFF70CF9E86DC2FEE3CF6F374B43C854E3342A2F1AC3E30" & _
    "C741CC41E679DF6D07CE6FA3A66083EC9B8C8BF3AF05D8BDBB0AA6CB3EF8C5BAA2A5" & _
    "E531BA9E28592F99E0FE4F95169A6C63F635D0197E325C5EC76219B907E4EBDCD401FB1" & _
    "986E4E3CA661FF73E7E2B8FD9988E753B7042B2BBCA76679") = _
    "1660899461379861685353688491843017402046137536931563604625752175601309049219" & _
    "5397632483978280801827700029602706087374780329179786968451649489474169926767" & _
    "4246881622658654267131250470956587908385447044319923040838072975636163137212" & _
    "8878242485755103411040294617585948551591743298921259938445664971761026682621" & _
    "39513"

End Sub

也是statman的基准。信息:大数的十六进制转换

郎成弘
2023-03-14

这里有一个快速的实现,可以处理任意大的数字。这种实现的目的是简单,而不是性能;因此,如果要在生产场景中使用,应该对它进行彻底的优化。

编辑:根据Dan Byström的反十进制到十六进制转换的实现进一步简化:

static string HexToDecimal(string hex)
{
    List<int> dec = new List<int> { 0 };   // decimal result

    foreach (char c in hex)
    {
        int carry = Convert.ToInt32(c.ToString(), 16);   
            // initially holds decimal value of current hex digit;
            // subsequently holds carry-over for multiplication

        for (int i = 0; i < dec.Count; ++i)
        {
            int val = dec[i] * 16 + carry;
            dec[i] = val % 10;
            carry = val / 10;
        }

        while (carry > 0)
        {
            dec.Add(carry % 10);
            carry /= 10;
        }
    }

    var chars = dec.Select(d => (char)('0' + d));
    var cArr = chars.Reverse().ToArray();
    return new string(cArr);
}
 类似资料:
  • 问题内容: 我需要从随机整数(0-255)列表中创建一个十六进制数字字符串。每个十六进制数字应由两个字符表示:5-“ 05”,16-“ 10”等。 例: 我设法提出了: 但是,这看起来有点尴尬。有没有更简单的方法? 问题答案:

  • 问题内容: 我写了一些代码将十六进制显示字符串转换为十进制整数。但是,当输入类似100a或625b(带有字母的东西)时,我得到了这样的错误: java.lang.NumberFormatException:对于输入字符串:java.lang.Integer.parseInt(未知源)处的java.lang.NumberFormatException.forInputString(未知源)处为“ 1

  • 我正在写一个Rust程序,读取I2C总线并保存数据。当我读取I2C总线时,我会得到十六进制值,比如,,等等。 现在,我只能将其作为字符串处理并按原样保存。有没有办法把它解析成一个整数?它有内置的功能吗?

  • 问题内容: 我在ex中有整数。16,我正在尝试将此数字转换为十六进制数字。我试图通过使用十六进制函数来实现此目的,但是每当您向十六进制函数提供整数时,它都会返回十六进制数字的字符串表示形式, 有人可以告诉我如何将字符串格式的十六进制数字转换为简单的十六进制数字。 谢谢!! 问题答案:

  • 问题内容: 我想将整数数字格式化为十六进制字符串。 打印,但我希望它作为。我怎么做? 问题答案: 试试这个

  • 问题内容: 我想将十六进制字符串转换为二进制字符串。例如,十六进制2是0010。下面是代码: 但是,这仅适用于十六进制0-9;它不适用于十六进制A-F,因为它使用。谁能增强它? 问题答案: 您需要告诉Java int是十六进制的,如下所示: