我希望将文本转换为base 4(AGCT),首先将其转换为二进制(我已完成此位),然后将其分成2位对。
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
答案 0 :(得分:1)
.NET不支持转换为非标准库,例如4,因此这不起作用:
Dim base4number As String = Convert.ToString(base10number, 4)
[...]返回值[...]的基数必须为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"))
并且,重复它,因为它是一个非常好的数学属性:任何其他至少有两个不同数字的基数也是如此。