gpt4 book ai didi

vb.net - 使用 VB.NET 发送包括十六进制的 UDP 数据

转载 作者:行者123 更新时间:2023-12-02 11:36:02 25 4
gpt4 key购买 nike

作为一种爱好,我对编程一个连接以太网的 LED 标牌以在屏幕上滚动消息很感兴趣。但我在 VB.NET 中创建 UDP 发送器时遇到问题(我目前使用的是 2008)。

现在标志已经足够漂亮了 a specifications sheet on programming for it .

但要发送给它的行示例(第 3 页):

<0x01>Z30<0x02>AA<0x06><0x1B>0b<0x1C>1<0x1A>1This message will show up on the screen<0x04>

使用 <0x01> 等代表十六进制字符的代码。

现在,要将其发送到标志,我需要使用 UDP 。但是,我的示例都将消息编码为 ASCII在发送之前,像这样(来自 UDP: Client sends packets to, and receives packets from, a server ):

Imports System.Threading
Imports System.Net.Sockets
Imports System.IO
Imports System.Net


Public Class MainClass
Shared Dim client As UdpClient
Shared Dim receivePoint As IPEndPoint


Public Shared Sub Main()
receivePoint = New IPEndPoint(New IPAddress(0), 0)
client = New UdpClient(8888)
Dim thread As Thread = New Thread(New ThreadStart(AddressOf WaitForPackets))
thread.Start()


Dim packet As String = "client"
Console.WriteLine("Sending packet containing: ")

'
' Note the following line below, would appear to be my problem.
'

Dim data As Byte() = System.Text.Encoding.ASCII.GetBytes(packet)
client.Send(data, data.Length, "localhost", 5000)
Console.WriteLine("Packet sent")

End Sub

Shared Public Sub WaitForPackets()
While True
Dim data As Byte() = client.Receive(receivePoint)
Console.WriteLine("Packet received:" & _
vbCrLf & "Length: " & data.Length & vbCrLf & _
System.Text.Encoding.ASCII.GetString(data))

End While

End Sub ' WaitForPackets

End Class

要在 VB.NET 中输出十六进制代码,我认为语法可能是 &H1A - 发送规范定义为 <0x1A> 的内容。

我可以修改该代码,以正确地将格式正确的数据包发送到该标志吗?

Grant(发送包含十六进制的数据包后)、Hamish Smith(使用函数获取十六进制值)和 Hafthor(将 chr() 消息硬编码到示例中)的答案在尝试时均无效。所以我会研究一下还有什么地方可能出错。理论上,如果这个字符串发送成功,我应该会收到一条包含“OK”的消息,这将有助于知道它何时起作用。

我已经尝试过,现在能够监控正在通过的数据包。工作数据包示例如下(原始十六进制):http://www.brettjamesonline.com/misc/forums/other/working.raw与我的版本:http://www.brettjamesonline.com/misc/forums/other/failed.raw 。不同之处在于我的十六进制代码仍然没有正确编码,如并排图像所示:http://www.brettjamesonline.com/misc/forums/other/snapshotcoding.png .

我使用此代码生成数据包并发送它:

container = &H1 & "Z" & &H30 & &H2 & "temp.nrg" & &H1C & "1Something" & &H4
' This did not appear to work neither
'container = Chr(&H1) & "Z" & Chr(&H30) & Chr(&H2) & Chr(&H1C) & "1Something" & Chr(&H4)
'<0x01>Z00<0x02>FILENAME<0x1C>1Test to display<0x04> <- the "official" spec to send
Dim sendBytes As [Byte]() = Encoding.ASCII.GetBytes(container)

(完整代码片段:http://pastebin.com/f44417743。)

最佳答案

您可以组装一个像这样的快速解码器:

Function HexCodeToHexChar(ByVal m as System.Text.RegularExpressions.Match) As String
Return Chr(Integer.Parse(m.Value.Substring("<0x".Length, 2), _
Globalization.NumberStyles.HexNumber))
End Function

然后用它来转换:

Dim r As New System.Text.RegularExpressions.Regex("<0x[0-9a-fA-F]{2}>")
Dim s As String = r.Replace("abc<0x44>efg", AddressOf HexCodeToHexChar)
' s should now be "abcDefg"

您还可以创建一个编码器函数来撤消此解码(尽管稍微复杂一些)

Function HexCharToHexCode(ByVal m As Match) As String
If m.Value.StartsWith("<0x") And m.Value.EndsWith(">") And m.Value.Length = "<0x??>".Length Then
Return "<0<0x78>" + m.Value.Substring("<0x".Length)
ElseIf Asc(m.Value) >= 0 And Asc(m.Value) <= &HFF Then
Return "<0x" + Right("0" + Hex(Asc(m.Value)), 2) + ">"
Else
Throw New ArgumentException("Non-SBCS ANSI characters not supported")
End If
End Function

并用它来转换:

Dim r As New Regex("[^ -~]|<0x[0-9a-fA-F]{2}>")
Dim s As String = r.Replace("abc"+chr(4)+"efg", AddressOf HexCharToHexCode)
' s should now be "abc<0x04>efg"

或者您可以只构建包含特殊字符的字符串,如下所示:

Dim packet As String = Chr(&H01) + "Z30" + Chr(&H02) + "AA" + Chr(&H06) + _
Chr(&H1B) + "0b" + Chr(&H1C) + "1" + Chr(&H1A) + _
"1This message will show up on the screen" + Chr(&H04)

要发送 UDP 数据包,以下内容就足够了:

Dim i As New IPEndPoint(IPAddress.Parse("192.168.0.5"), 3001) ''//Target IP:port
Dim u As New UdpClient()
Dim b As Byte() = Encoding.UTF8.GetBytes(s) ''//Where s is the decoded string
u.Send(b, b.Length, i)

关于vb.net - 使用 VB.NET 发送包括十六进制的 UDP 数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/169377/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com