提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
VB.net小技巧——数字的进制转化及处理在与FPGA的交互中,一般来说16进制,2进制用的比较多,但在界面中一般需要转化成10进制进行显示和公式运算。因此在这里列出一些常用的进制转化的方法,以便查阅。
1、10进制转2进制、16进制
Dim int As Int32 = -32768
'十进制转二进制
Dim str2 As String = Convert.ToString(int, 2)
'十进制转十六进制
Dim str16 As String = Convert.ToString(int, 16)
Debug.WriteLine("十进制转二进制:" & str2)
Debug.WriteLine("十进制转十六进制:" & str16)
返回结果为
十进制转二进制:11111111111111111000000000000000 十进制转十六进制:ffff8000
2、16进制转10进制
'十六进制
Dim str16 As String = "8000"
'十六进制转十进制
Dim int16 As Integer = Convert.ToInt16(str16, 16)
Debug.WriteLine(int16)
Dim int32 As Integer = Convert.ToInt32(str16, 16)
Debug.WriteLine(int32)
结果为
-32768 32768
3、接收到的数据为32bit,其中[28:0]是有效位,是一个有符号数,但[31:29]为0
Dim str32 As String = "10000009"
Dim mask As String = "e0000000"
'十六进制转十进制
Dim int32 As Integer = Convert.ToInt32(str32, 16) Or Convert.ToInt32(mask, 16)
Debug.WriteLine(int32)
4、根据工程实际需求,设计一个函数满足数据截取和数据计算的需求。
形参:
1、string 32bit 数据
2、有效位置:按照verilog的习惯表达,例如[5:4],[0],[31:0]等
3、指示这个数据是不是有符号数
Public Function bitterCal(ByVal aa As String, ByVal bb As String, ByVal cc As UInt32) As Int64
Dim dd = Strings.Replace(Strings.Replace(bb, "[", ""), "]", "")
Dim ff(2) As String
Dim ee(2) As String
ee = Split(dd, ":")
If ee.Length = 1 Then
ff(0) = ee(0)
ff(1) = ee(0)
ElseIf ee.Length = 2 Then
ff(0) = ee(0)
ff(1) = ee(1)
End If
Dim gg(2) As Int16
gg(0) = Val(ff(0))
gg(1) = Val(ff(1))
Dim hh As UInt64 = CLng("&h" & aa) >> gg(1)
Dim mask1 As Int64 = -2 ^ (gg(0) - gg(1) + 1)
Dim ii As Int64 = hh Or mask1
If cc = 0 Then
ii = hh And (Not mask1)
End If
bitterCal = ii
End Function
例如,输入
Debug.WriteLine(bitterCal("ffffffff", "[31:0]", 1))
输出为 -1。
Debug.WriteLine(bitterCal("00c4c4c4", "[15:8]", 1))
输出为 -60。
这样就比较方便了。
我这样写肯定不是最简洁的,有更好建议的童鞋在评论区可以留言指正。



