在没有递归的情况下在 Visual Basic(或伪代码算法)中寻找十进制到字母数字的基本转换器库

Posted

技术标签:

【中文标题】在没有递归的情况下在 Visual Basic(或伪代码算法)中寻找十进制到字母数字的基本转换器库【英文标题】:Looking for decimal to alphanumeric number base converter library in Visual Basic (or pseudo code algorithm) WITHOUT recursion 【发布时间】:2012-03-16 11:29:41 【问题描述】:

我正在寻找不使用递归的 Visual Basic 中的十进制到字母数字基数转换器库。

我发现: http://visualstudiomagazine.com/articles/2010/07/20/when-hexadecimal-is-not-enough.aspx

其中包含一个演示应用程序,但发现它使用递归。当我尝试将库集成到我自己的 Visual Studio Express 2010 Visual Basic 项目中时,使用递归的问题变得很明显:我遇到了堆栈溢出异常。

现在我可以考虑增加为堆栈分配的内存大小,但可能很难确定这是什么,因为递归深度可能会因要转换的值而异。

我的情况需要一个可靠的确定性解决方案,所以我宁愿不考虑使用递归的想法。

我将做更多的研究并努力从头开始编写算法,但如果它已经存在,我宁愿不重新发明***,所以这个问题。在这里搜索并没有完全找到我想要的东西。

您能否指出 Visual Basic 中现有的非递归十进制到字母数字转换器库的方向?

【问题讨论】:

它有一个指向这个的链接(不检查它是否使用递归):devx.com/vb2themax/Tip/19316 +1 @assylias 谢谢它看起来很有希望,现在检查一下...... 是的,看起来没有递归:) 我看过了,它不是最易读的代码,VB 使用函数名作为返回值可能会产生误导,但是是的,似乎没有递归。所以现在我要将它集成到我的 Visual Studio 2010 Express Visual Basic 项目中并进行测试。我会报告,然后,如果好的@assylias,如果你提供这个作为答案,我应该能够接受并投票。 如果你设法让它工作,发布你的代码作为答案,它会比一个链接更好;) +1 再次@assylias,我会尝试,但我希望你能接受:你所要做的就是发布与答案相同的评论(我会赞成并接受)。但是暂时不要这样做——一旦我发现代码可以工作,我会告诉你继续。我的工作期限很紧,所以今天晚些时候可能会有一些结果...... 【参考方案1】:

我自己提供的这个解决方案似乎很有效 - 也很简单!但那是因为它是一种单向转换;其他库的目标是双向转换,在不同的基础之间来回转换 - 但我不需要两种方式。


Public Class BaseConverter


    Public Shared Function ConvertToBase(num As Integer, nbase As Integer) As String

        Dim retval = ""

        Dim chars As String = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"

        ' check if we can convert to another base
        If (nbase  chars.Length) Then
            retval = ""
        End If

        Dim r As Integer

        Dim newNumber As String = ""

        ' in r we have the offset of the char that was converted to the new base
        While num >= nbase
            r = num Mod nbase
            newNumber = chars(r) & newNumber

            'use: num = Convert.ToInt32(num / nbase)
            '(if available on your system)
            'otherwise:
            num = num \ nbase
            ' notice the back slash \ - this is integer division, i.e the calculation only reports back the whole number of times that
            ' the divider will go into the number to be divided, e.g. 7 \ 2 produces 3 (contrasted with 7 / 2 produces 3.5, 
            ' float which would cause the compiler to fail the compile with a type mismatch)
        End While

        ' the last number to convert
        newNumber = chars(num) & newNumber

        Return newNumber
    End Function


End Class

我根据以下链接中的 C# 代码在 Visual Basic 中创建了上述代码:

信用:http://social.msdn.microsoft.com/Forums/en-US/csharpgeneral/thread/5babf71f-4375-40aa-971a-21c1f0b9762b/ ("从十进制(base-10) 转换为字母数字(base-36)")


public String ConvertToBase(int num, int nbase)

    String chars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";

    // check if we can convert to another base
    if(nbase  chars.Length)
        return "";

    int r;
    String newNumber = "";

    // in r we have the offset of the char that was converted to the new base
    while(num >= nbase)
    
        r = num % nbase;
        newNumber = chars[r] + newNumber;
        num = num / nbase;
    
    // the last number to convert
    newNumber = chars[num] + newNumber;

    return newNumber;

@assylias 我无法让devx.com/vb2themax/Tip/19316 工作 - 我得到了错误的值。不过还是谢谢你的建议。

没有证据表明它有效。我调整了代码的一些声明和表面结构,使其在 Visual Studio Express 2010 Visual Basic 中成功构建。然后单步调试 Visual Studio Express 2010 Visual Basic 调试器中的代码,代码很难理解:变量名不明显,没有关于它为什么这样做的原因。根据我的理解,它似乎不应该这样做来进行基本转换。

【讨论】:

以上是关于在没有递归的情况下在 Visual Basic(或伪代码算法)中寻找十进制到字母数字的基本转换器库的主要内容,如果未能解决你的问题,请参考以下文章

我可以在没有安装 Visual Studio 的情况下在 Windows 服务器上构建 .NET Core 应用程序吗?

如何在没有Javascript调试的情况下在网站启动时在Visual Studio中启动新的Chrome实例?

如何在没有 SQL Server Management Studio 的情况下在 SQL Server Express LocalDB 中使用 Visual Studio 2013 创建两个表之间的关

Visual basic System.Data.OleDb.OleDbException:“没有为一个或多个必需参数提供值。”

在不安装 Visual Studio 的情况下在机器上调试代码

visual C++ 创建一个窗口却无法显示窗口的原因是啥?