进制数转换器的VB算法实现(2/8/10/16进制数可以相互转换)

VB6中新建一个工程,当前窗体默认为form1,添加一个框架控件frame、几个文本框控件text、几个标签控件label、两个timer计时器、三个按钮控件、添加一个窗体form2、一个模块module1、几个菜单项。然后将form1上的各个控件调至适当位置,并且更改它们的标题属性。注意:那四个文本框为文本框控件数组,分别为text1(0)text1(1)text1(2)text1(3)

【程 计】

1、实现281016进制数之间的相互转换,一共有种 转换方式,即:2--->82--->102--->168--->28--->108--->1610--->210--->810--->1616--->216--->816--->10,这样12种转换方式

2、双击模块moduel1,进入代码编辑模式,开始编写这12种转换方式的模块函数。核心代码如下(以逗号开始的为注释内容):

Option Explicit

'2进制转换为10制数

Public Function BinToDec(bin As String) As Long

Dim i As Long

For i = 1 To Len(bin)

BinToDec = BinToDec * 2 + Val(Mid(bin,i,1))

Next

End Function

'10进制转换为2制数

Public Function DecToBin(dec As Long) As String

DecToBin = ""

Do While dec > 0

DecToBin = (dec Mod 2) & DecToBin

dec = dec / 2

Loop

End Function

'16进制数转换为10进制数

Public Function HexToDec(str2 As String) As Long

Dim i As Long,a As Variant,k As Long

k = 0

For i = Len(str2) - 1 To 0 Step -1

a = Asc(LCase(Mid(str2,Len(str2) - i,1))) '统一求得各个字符的小写状态下的字符所对应的ASCII

a = IIf(a >= 48 And a <= 57,a - 48,a - 87)

'0ASCII码为48,字母aASCII码为97,16进制下的A对应为10进制下的10

'如果a16进制下为 0 9 的数,则-------

'如果a16进制下为 a f 的数,则-------

k = k + (16 ^ i) * a '累加,就像 12345=1*10^4+2*10^3+3*10^2+4*10^1+5*1^0

Next

HexToDec = k '得到的这个返回值 K 就是转换后的10进制数

End Function

'10进制转换成16进制数

Public Function DecToHex(X As Long) As String

Dim a As String

Dim r As String

Do While X > 0

r = X Mod 16

X = X / 16

r = IIf(r > 9,Chr(Asc(r - 9) + 16),r)

'如果这里不减9,一旦r11,12,13,14,15时,就只得到 1 ASCII码值,得到了一个错误的结果。

a = r + a

Loop

DecToHex = a

End Function

'10进制转换为8进制

Public Function DecToOct(dec As Long) As String

DecToOct = ""

Do While dec > 0

DecToOct = (dec Mod 8) & DecToOct

dec = dec / 8

Loop

End Function

'8进制转换为10进制

Public Function OctToDec(str2 As String) As Long

Dim i As Long,k As Long

k = 0

For i = Len(str2) - 1 To 0 Step -1

a = Asc(Mid(str2,1)) '统一求得各个字符的小写状态下的字符所对应的ASCII

a = a - 48

k = k + (8 ^ i) * a '累加,就像 12345=1*10^4+2*10^3+3*10^2+4*10^1+5*1^0

Next

OctToDec = k '得到的这个返回值 K 就是转换后的10进制数

End Function

'8进制转换为16进制

Public Function OctToHex(Oct As String) As String

Dim dec As Long

dec = OctToDec(Oct) '8进制转10进制

OctToHex = DecToHex(dec) ' 10进制转16进制

End Function

'8进制转为2进制

Public Function OctToBin(Oct As String) As String

Dim dec As Long

dec = OctToDec(Oct) '8进制转10进制

OctToBin = DecToBin(dec) ' 10进制转2进制

End Function

'16进制转为8进制

Public Function HexToOct(Hex As String) As String

Dim dec As Long

dec = HexToDec(Hex) '16进制转10进制

HexToOct = DecToOct(dec) '10进制转8进制

End Function

'16进制转为2进制

Public Function HexToBin(Hex As String) As String

Dim dec As Long

dec = HexToDec(Hex) '16进制转10进制

HexToBin = DecToBin(dec) '10进制转2进制

End Function

'2进制转化为16进制

Public Function BinToHex(bin As String) As String

Dim dec As Long

dec = BinToDec(bin) '2进制转为10进制

BinToHex = DecToHex(dec) '10进制转为16进制

End Function

'2进制转化为8进制

Public Function BinToOct(bin As String) As String

Dim dec As Long

dec = BinToDec(bin) '2进制转化为10进制

BinToOct = DecToOct(dec) '10进制转化为8进制

End Function

3、如何判断文本框中是否输入了无效的数据,以及如何防止这种行为?

比如:2进制数只能由01构成,8制数只能由01----7构成,10进制数只能由01-------9构成,16进制数只能由01------9ab-----fAB------F构成。

所以我们需要一个keypress事件来控件这种形为,让各自对应的文本框只能按受对应的按键值。text1keypress事件代码:

Private Sub Text1_KeyPress(Index As Integer,KeyAscii As Integer)

Select Case Index '这个文本框为一个控件数组,即依次为text1(0),text1(1),text1(2),text1(3)

Case 0 '第一个文本框,这个文本框只能输入2进进制的数,仅由0,1组成 退格键的ASCII码为8

If Not (KeyAscii >= 48 And KeyAscii <= 49 Or KeyAscii = 8) Then

KeyAscii = 0 ' 取消键的ASCII码为0,即此次输入的无效内容被屏蔽

End If

Case 1 '第二个文本框,这个文本框只能输入8进进制的数,1,----7组成

If Not (KeyAscii >= 48 And KeyAscii <= 55 Or KeyAscii = 8) Then

KeyAscii = 0

End If

Case 2 '这个文本框只能输入8进进制的数,----9组成

If Not (KeyAscii >= 48 And KeyAscii <= 57 Or KeyAscii = 8) Then

KeyAscii = 0

End If

Case 3 '这个文本框只能输入8进进制的数,----9,a-----f,A-----F组成

If Not (KeyAscii >= 48 And KeyAscii <= 57 Or KeyAscii >= 97 And KeyAscii <= 102 Or KeyAscii >= 65 And KeyAscii <= 70 Or KeyAscii = 8) Then

KeyAscii = 0

End If

End Select

End Sub

4、当用户点击“开始转换”按钮时,大致会有4种情况:

1),如果这四个文本框都为空值,则应该能够给出相应的提示信息:不能全部为空值------

2),如果用户只是在其中一个文本框中输入数据,程序必须自己判断是哪一个文本框,然后调用相应的转换函数来完成转换。

3),如果用户在这四个文本框中都输入数据,程序应该给出一个对话框,让用户选择到底从哪一种数据开始,转换为其它的三种类型数据。

4),在转换过程中,如果用户输入的数据过大,或其它某种未知的原因,而造成程序出现错误,程序应该能够给出相应的错误处理机制来响应用户的操作。

Command1click事件:

Private Sub Command1_Click()

Dim X As Integer,i As Integer,Y As Integer

Dim result '定义后面弹出对话框的处理结果为变体类型

On Error Resume Next '如果出现错误,后面有专门的程序来处理

For i = 0 To 3

If Text1(i) <> "" Then

X = i '如果是哪一个文本框中有内容,那么文本框的下标值就给后面的x,并且退出这里的循环

Exit For

Else

X = 4 '这时所有的文本框都为空

End If

Next

'如果至少有两个文本框有数据,那么下面11行程序就开始工作;否则,程序会路过下面的这11

Y = -1

For i = 0 To 3

If Text1(i) <> "" Then Y = Y + 1

Next

If Y >= 1 Then

CheckValue: X = Val(InputBox("至少两个文本框有数据,你希望从第几个文本框的内容转换为其它数据? 输入:1,2,3,4(你选一个数)","巍威提示你!","1",Screen.Width / 2,Screen.Height / 2)) - 1

End If

If Not (X >= 0 And X <= 4) Then

MsgBox "您这次操作不正确,请按照提示来",vbOKOnly,"巍威提示你!"

GoTo CheckValue '程序转至上面的CheckValue标记处,x的值限定在04之间

End If

Select Case X

Case 0 ' 这时,第一个文本框不为空,从第一个文本框的内容开始向其它进制数开始转换

Text1(1) = BinToOct(Text1(0)) '2进制转为8进制,并显示出来

Text1(2) = BinToDec(Text1(0)) '2进制转为10进制

Text1(3) = BinToHex(Text1(0)) '2进制转为16进制

Case 1 ' 这时,第一个文本框为空,第二个文本框不为空,从第二个文本框的内容开始向其它进制数开始转换

Text1(0) = OctToBin(Text1(1)) '8进制转为2进制

Text1(2) = OctToDec(Text1(1)) '8进制转为10进制

Text1(3) = OctToHex(Text1(1)) '8进制转为16进制

Case 2 ' 这时,第一/二个文本框都为空,第三个文本框不为空,从第三个文本框的内容开始向其它进制数开始转换

Text1(0) = DecToBin(Text1(2)) '10进制转为2进制

Text1(1) = DecToOct(Text1(2)) '10进制转为8进制

Text1(3) = DecToHex(Text1(2)) '10进制转为16进制

Case 3 '这时,第一//三个文本框都为空,第四个文本框不为空,从第四个文本框的内容开始向其它进制数转换

Text1(0) = HexToBin(Text1(3)) '16进制转为2进制

Text1(1) = HexToOct(Text1(3)) '16进制转为8进制

Text1(2) = HexToDec(Text1(3)) '16进制转为10进制

Text1(3) = UCase(Text1(3)) '将本身全部转化为大写状态

Case 4

MsgBox "不能让所有的文本框为空,请你在任一个文本框中输入相应数据,然后回车","巍威提示你!"

Text1(0).SetFocus '让第一个文本框获取焦点

Exit Sub

End Select

Text1(0).SetFocus '让第一个文本框获取焦点

Timer1.Enabled = False '关闭记时器

Label5.Visible = False '隐藏警告标语

'如果出现了错误,

If Err.Number > 0 Then

'弹出一个对话框,告诉用户当前的错误所在

result = MsgBox("很抱歉,你的操作造成了 '" + Err.Description + "'" + vbCrLf + "要清空所有的文本框,重新输入吗?",vbYesNo,"巍威提示你!")

If result = 6 Then ' 如果用户回答"",则点击清空按钮

Command2.Value = True

Else ' 如果用户回答"",则启动记时器,显示警告标语,并且转换功能的按钮不可用

Timer1.Enabled = True

Command1.Enabled = False

Exit Sub '退出这个过程

End If

End If

End Sub

5、至此这个“进制数转换器”大致成型。但是还有很多的细节,也值得你关注,因为作为一个软件,人机交互界面就显得非常重要。例如:把“开始转换”按钮的Default属性为true,当用户直接按Enter键时,就相当于已用鼠标点击了这个按钮;把“退出”按钮的Cancel属性设为true,当用户直接按Esc键时,就相当于已用鼠标点击了这个按钮;在timer2timer事件中设置 form1.caption=“进制数转换器”+str(now),并且把timer2interval设置为1000毫秒,即每秒触发一次,这样,当你运行这个程序时,你就会看到窗体的标题栏显示一个动态的电子时钟

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Format[$] ( expr [ , fmt ] ) format 返回变体型 format$ 强制返回为文本 -------------------------------- 数字类型的格式化 --------------------------------     固定格式参数:     General Number 普通数字,如可以用来去掉千位分隔号     format$("100,1
VB6或者ASP 格式化时间为 MM/dd/yyyy 格式,竟然没有好的办法, Format 或者FormatDateTime 竟然结果和系统设置的区域语言的日期和时间格式相关。意思是尽管你用诸如 Format(Now, "MM/dd/yyyy"),如果系统的设置格式区域语言的日期和时间格式分隔符是"-",那他还会显示为 MM-dd-yyyy     只有拼凑: <%response.write
在项目中添加如下代码:新建窗口来显示异常信息。 Namespace My ‘全局错误处理,新的解决方案直接添加本ApplicationEvents.vb 到工程即可 ‘添加后还需要一个From用来显示错误。如果到这步还不会则需要先打好基础啦 ‘======================================================== ‘以下事件
转了这一篇文章,原来一直想用C#做k3的插件开发,vb没有C#用的爽呀,这篇文章写与2011年,看来我以前没有认真去找这个方法呀。 https://blog.csdn.net/chzjxgd/article/details/6176325 金蝶K3 BOS的插件官方是用VB6编写的,如果  能用.Net下的语言工具开发BOS插件是一件很愉快的事情,其中缘由不言而喻,而本文则是个人首创,实现在了用V
Sub 分列() ‘以空格为分隔符,连续空格只算1个。对所选中的单元格进行处理 Dim m As Range, tmpStr As String, s As String Dim x As Integer, y As Integer, subStr As String If MsgBox("确定要分列处理吗?请确定分列的数据会覆盖它后面的单元格!", _
  窗体代码 1 Private Sub Text1_OLEDragDrop(Data As DataObject, Effect As Long, Button As Integer, Shift As Integer, X As Single, Y As Single) 2 Dim path As String, hash As String 3 For Each fil
  Imports MySql.Data.MySqlClient Public Class Form1 ‘ GLOBAL DECLARATIONS Dim conString As String = "Server=localhost;Database=net2;Uid=root;Pwd=123456;" Dim con As New MySqlConnection
‘導入命名空間 Imports ADODB Imports Microsoft.Office.Interop   Private Sub A1() Dim Sql As String Dim Cnn As New ADODB.Connection Dim Rs As New ADODB.Recordset Dim S As String   S = "Provider=OraOLEDB.Oracl
Imports System.IO Imports System.Threading Imports System.Diagnostics Public Class Form1 Dim A(254) As String    Function ping(ByVal IP As Integer) As String Dim IPAddress As String IPAddress = "10.0.
VB运行EXE程序,并等待其运行结束 参考:https://blog.csdn.net/useway/article/details/5494084 Private Declare Function WaitForSingleObject Lib "kernel32" (ByVal hHandle As Long, ByVal dwMilliseconds As Long) As Long Pr
今天碰到一个问题,登陆的时候,如果不需要验证手机号为空,则不去验证手机号 因为登陆的时候所有的验证信息都存放在一个数组里 Dim CheckUserInfo() As String ={UserBirthday, SecEmail, UserMob, UserSex, RealNameFirst, RealName, CheckCardID, CheckCardType, Contactemail
在VB6.0中,数据访问接口有三种: 1、ActiveX数据对象(ADO) 2、远程数据对象(RDO) 3、数据访问对象(DAO) 1.使用ADO(ActiveX Data Objec,ActiveX数据对象)连接SQL Server 1)使用ADO控件连接 使用ADO控件的ConnectionString属性就可以连接SQL Server,该属性包含一个由分号分隔的argument=value语
注:大家如果没有VB6.0的安装文件,可自行百度一下下载,一般文件大小在200M左右的均为完整版的软件,可以使用。   特别提示:安装此软件的时候最好退出360杀毒软件(包括360安全卫士,电脑管家等,如果电脑上有这些软件的话),因为现如今的360杀毒软件直接会对VB6.0软件误报,这样的话就可能会在安装过程中被误报阻止而导致安装失败,或者是安装后缺乏很多必须的组件(其它的杀毒软件或安全卫士之类的
Private Sub Form_Load() Call conndb End Sub Private Function conndb() Dim cn As New ADODB.Connection Dim rs As New ADODB.Recordset Dim strCn, sql As String Dim db_host As String Dim db_user As String
  PPSM06S70:  Add  moddate  EDITSPRINTJOB:  MAX(TO_CHAR(ETRN.MODDATE, ‘yyyy/mm/dd/HH24:MI AM‘)) ACTUAL_SHIPDATE   4.Test Scenario (1) :Query SQL Test DN:8016578337 SELECT CTRN.TKCTID TRUCK_ID,        
  沒有出現CrystalReportViewer時,須安裝CRforVS_13_0. 新增1個數據集,新增1個數據表,添加二列,列名要和資料庫名一樣. 修改目標Framework 修改app.config, <startup >改成<startup useLegacyV2RuntimeActivationPolicy ="true">  CrystalReport1.rpt增加數據庫專家 在表單
Imports System.Threading Imports System Public Class Form1 Dim th1, th2 As Thread Public Sub Method1() Dim i As Integer For i = 1 To 100 If Me.Label1.BackColor =
Friend Const PROCESS_ALL_ACCESS = &H1F0FFF = 2035711 Friend Const PROCESS_VM_READ = &H10 Friend Const PROCESS_VM_WRITE = &H20 Friend Const PAGE_READONLY = &H2 Friend Const PAGE_READWRITE = &H4 Friend
以下代码随手写的 并没有大量测试 效率也有待提升 如果需要C#的请自行转换 Function SplitBytes(Data As Byte(), Delimiter As Byte()) As List(Of Byte()) Dim i = 0 Dim List As New List(Of Byte()) Dim bytes As New
Imports System.Data.SqlClient Public Class Form1 REM Public conn1 As SqlConnection = New SqlConnection("server=.; Integrated Security=False;Initial Catalog= mydatabase1; User ID= sa;password")