将字符串从Base2转换为Base4

时间:2014-03-11 23:46:23

标签: vb.net string

我希望将文本转换为base 4(AGCT),首先将其转换为二进制(我已完成此位),然后将其分成2位对。

有人可以帮助我使用vb.net语法将其转换为代码吗?

if(二进制字符串的长度是奇数)在字符串的前面(最左边的位置)添加零。创建一个空字符串以添加翻译的数字。原始的二进制字符串不为空{仅将二进制字符串的前两位数转换为基数为4的数字,并将此数字添加到新字符串的结尾(最右侧)索引。在此之后,从二进制字符串中删除相同的两位数字,如果它不为空则重复。 }

在此背景下:

    Dim Base2Convert As String = ""
    For Each C As Char In Result.Text
        Dim s As String = System.Convert.ToString(AscW(C), 2).PadLeft(8, "0")
        Base2Convert &= s
    Next
    Result.Text = Base2Convert 

    Dim Base4Convert As String = ""
    For Each C As Char In Result.Text
        '//<ADD THE STATEMENT ABOVE AS CODE HERE>//
        Base4Convert &= s
    Next
    Result.Text = Base4Convert 

2 个答案:

答案 0 :(得分:1)

.NET不支持转换为非标准库,例如4,因此这不起作用:

Dim base4number As String = Convert.ToString(base10number, 4)

From MSDN

  

[...]返回值[...]的基数必须为2,8,10或16。

但是你可以编写自己的转换函数,或者从网上获取现有的转换函数:

Public Function IntToStringFast(value As Integer, baseChars As Char()) As String
  Dim i As Integer = 32
  Dim buffer(i - 1) As Char
  Dim targetBase As Integer = baseChars.Length

  Do
    buffer(System.Threading.Interlocked.Decrement(i)) =
      baseChars(value Mod targetBase)
    value = value \ targetBase
  Loop While value > 0

  Dim result As Char() = New Char(32 - i - 1) {}
  Array.Copy(buffer, i, result, 0, 32 - i)

  Return New String(result)
End Function

已使用this answer。使用developer fusion从C#+微调进行转换。例如:

Dim base2number As String = "11110" 'Decimal 30
Dim base10number As Integer = Convert.ToInt32(base2number, 2)
Dim base4number As String = IntToStringFast(base10number, "0123") 
Console.WriteLine(base4number) 'outputs 132

请注意,您不需要base 2作为中间值,您可以直接从base 10转换。如果有疑问,无论它是否正常工作,这里是一个有用的资源:

答案 1 :(得分:0)

首先将数字转换为base然后转换为base 4没有多大意义,因为直接转换为base 4无论如何都是相同的算法。事实上,任何基数中的数字表示需要相同的通用算​​法:

Public Shared Function Representation(number As Integer, digits As String) As String
    Dim result = ""
    Dim b = digits.Length

    Do
        result = digits(number Mod b) & result
        number \= b
    Loop While number > 0

    Return result
End Function

现在,您可以验证Representation(i, decimal)是否与i.ToString()相同:

Dim decimalDigits = "0123456789"
For i = 0 To 30 Step 3
    Console.WriteLine("{0}, {1}", i.ToString(), Representation(i, decimalDigits))
Next

值得注意的是i.ToString()i转换为十进制基数,因为这是我们人类大多使用的基础。但是十进制并没有什么特别之处,实际上内部i 不是十进制数:它在计算机内存中的表示是二进制的。

要转换为任何其他基础,只需将另一组digits传递给该方法即可。在您的情况下,那就是"ACGT"

Console.WriteLine(Representation(i, "ACGT"))

十六进制也有效:

Console.WriteLine(Representation(i, "0123456789ABCDEF"))

并且,重复它,因为它是一个非常好的数学属性:任何其他至少有两个不同数字的基数也是如此。