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

Vb.net 使用Visual Basic 2005发送十六进制命令,vb.net,tcp,hex,lan,Vb.net,Tcp,Hex,Lan,大家好 我刚在论坛上注册,因为我真的需要帮助。问题是,我刚刚开始使用Visual Studio 2005,因为这就是我们这里的内容,我的目的是使用TCP LAN与设备通信,我知道设备的IP和端口……问题是设备只识别命令的十六进制值。我唯一能做的就是用winsockets在两台电脑之间编写某种聊天程序,以启用IP/端口通信,但正如您所知,聊天程序只发送strin阵列 这是我需要做的一个例子 我在表单上有两个文本框,一个名为command1,另一个名为send\u receive 在command1

大家好

我刚在论坛上注册,因为我真的需要帮助。问题是,我刚刚开始使用Visual Studio 2005,因为这就是我们这里的内容,我的目的是使用TCP LAN与设备通信,我知道设备的IP和端口……问题是设备只识别命令的十六进制值。我唯一能做的就是用winsockets在两台电脑之间编写某种聊天程序,以启用IP/端口通信,但正如您所知,聊天程序只发送strin阵列

这是我需要做的一个例子

我在表单上有两个文本框,一个名为command1,另一个名为send\u receive

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

在send_receive文本框中,我需要使用autoscroll查看我发送的命令,然后是我接收的命令

某种视觉上它看起来像这样。。差不多

-command1文本框-

05 6C 29 F1 3C 81

-发送/接收文本框-

0C 00 6C F1 29 7C 81 30 34 34 39

所以我被卡住了,从文本框中的05 6C 29 F1 3C 81字符串变为发送的十六进制05 6C 29 F1 3C 81

这是我所做的代码,记住它是为了在两台电脑之间聊天而做的,我需要知道我需要更改什么才能得到上面提到的内容,这是一个简短的代码,所以我会发布它,以防它对某人有帮助:D

导入System.IO 导入System.Net.Sockets

公开课表格1 Dim侦听器作为新的TcpListener1001 作为TcpClient的Dim客户端 Dim消息作为字符串=

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
末级

向您致意,希望您能帮助我。

您可以使用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") + " "

streamreader可能会尝试使用特定编码将数据解码为字符,因此,如果响应不能真正作为文本处理,则可能需要从客户端流中读取,而不使用流读取器。请尝试将十六进制命令列表转换为字节数组,并发送:

    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

如果你需要实际的代码,我可以上传给你看。是的,那会有帮助的。编辑您的帖子并添加代码。确保只发布少量代码,只发布与问题相关的代码。这里的人可能不会为您编写它,但会帮助您解决具体问题。您好,尝试使用您的方法,我在这一部分遇到以下错误:Dim bytes As Byteparts.Length。。。。错误是,数组绑定不能出现在类型说明符中,并且在部分下面有一条蓝线。。。你知道这是什么意思吗?@MiguelHunter:对不起,我把语法弄反了。大小在标识符之后。我更新了上面的代码。是的,我在web XD中的另一个示例中看到了这一点,但现在我得到了4个与stream=client.getstream对应的错误,它将其作为streamstream=client.getstream。。。在第一个流之后添加父代。。。我想其他3个ar与这个有关。@MiguelHunter:啊,有一些C语法在渗透,这应该是一个模糊的语句。我更新了代码。@MiguelHunter:我认为您应该使用相同的流进行读写。请参阅这里的示例:真的吗?…在原始按钮的Else块中,单击client=…所在行正下方的handler。。。。这段代码可以替换你在那里的3行书写器。伙计,如果我第一次没有得到它,我很抱歉,我只使用visual basic工作了不超过8个小时。。。所有这些对我来说都是新鲜事: