使用 Visual Basic 2005 发送十六进制命令



祝大家美好的一天,

我刚刚在论坛上注册,因为我真的需要帮助。 问题是我刚刚开始使用Visual Studio 2005(因为这就是我们这里所拥有的(,我的目的是使用TCP LAN与设备进行通信,我知道设备的IP和端口.....问题是设备仅识别命令的十六进制值。我唯一能做的就是在 2 台 PC usin Winsockets 之间做某种聊天程序以启用 IP/端口通信,但如您所知,聊天程序只发送 strin 数组。

这是我需要做的一个例子。

我在表单上有 2 个文本框,一个名为 command1,另一个名为 command1,另一个send_receive

在命令 1 文本框中,我手动输入我需要发送的十六进制,例如......05 6C 29 F1 3C 81有了这个,设备需要回答我...0C 00 6C F1 29 7C 81 30 34 31 34 39 39

在send_receive文本框中,我需要通过自动滚动查看我发送的命令,然后是我收到的命令......

某种视觉上它看起来像这样......嗯,有点

-

-命令1文本框--

05 6C 29 F1 3C 81

-

-send_receive文本框--

<-->--> 0C 00 6C F1 29 7C 81 30 34 31 34 39 39

所以我被困在从文本框中的 05 6C 29 F1 3C 81 字符串更改为十六进制 05 6C 29 F1 3C 81 以发送......

这是我所做工作的代码,请记住,它是出于 2 台 PC 之间的聊天目的而完成的,我需要知道我需要更改什么才能获得上面提到的内容,这是一个简短的代码,所以我会发布所有内容,以防万一它帮助某人:D

进口 System.IO导入系统.Net.Sockets

公开课表格1 将侦听器暗为新的 TcpListener(1001( 将客户端暗淡为 Tcp客户端 将消息暗淡为字符串 =">

Private Sub Form1_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
    listener.Stop()
End Sub
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    listener.Start()
    Timer1.Enabled = True
    Timer1.Start()
End Sub
Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
    Try
        If listener.Pending = True Then
            message = ""
            client = listener.AcceptTcpClient()
            Dim reader As New StreamReader(client.GetStream())
            While reader.Peek > -1
                message = message + Convert.ToChar(reader.Read()).ToString
            End While
            Me.Focus()
            TextBox4.Text = (TextBox4.Text + message + vbCrLf)
        End If
    Catch ex As Exception
        MsgBox(ex.Message)
    End Try
End Sub
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    Try
        If TextBox1.Text = "" Or TextBox2.Text = "" Or TextBox3.Text = "" Then
            MsgBox("Enter a username, enter a valid IP, enter a port, and enter a message.", MsgBoxStyle.Exclamation)
        Else
            client = New TcpClient(TextBox2.Text, 1001)
            Dim writer As New StreamWriter(client.GetStream())
            writer.Write(TextBox3.Text)
            writer.Flush()
            TextBox3.Text = ""
        End If
    Catch ex As Exception
        MsgBox(ex.Message, MsgBoxStyle.Critical)
    End Try
End Sub

结束类

最好的问候,我希望你能帮助我。

尝试将十六进制命令列表转换为字节数组并发送:

    Try
        Dim cmds As New List(Of Byte)
        For Each cmd As String In TextBox1.Text.Trim.Split(" ")
            cmds.Add(Convert.ToByte(cmd, 16))
        Next
        Dim bytes() As Byte = cmds.ToArray
        client.GetStream.Write(bytes, 0, bytes.Length)
    Catch ex As Exception
        MessageBox.Show("Invalid Hex Command")
    End Try

可以使用 Convert.ToByte 方法将十六进制值转换为字节。将字符串拆分为单独的十六进制代码并将每个十六进制代码转换为一个字节,然后您可以将它们写入流。

请注意,应直接使用客户端流,因为StreamWriter仅将文本写入流,而不是字节。

Dim parts As String() = TextBox3.Text.Split(" "C)
Dim bytes(parts.Length) As Byte
For i As Integer = 0 To parts.Length - 1
  bytes(i) = Convert.ToByte(parts(i), 16)
Next
client = New TcpClient(TextBox2.Text, 1001)
Dim stream As Stream = client.GetStream()
stream.Write(bytes, 0, bytes.Length)
stream.Flush()

读取数据时,可以将字符代码转换为十六进制表示形式:

message = message + reader.Read().ToString("x2") + " "
流读取器

可能会尝试使用特定编码将数据解码为字符,因此,如果响应实际上无法作为文本处理,则可能需要从客户端流中读取它,而无需在两者之间使用流读取器。

最新更新