Little endian是.NET中的自然顺序,所以它很容易使用。
至于消息的建设者,是不是很容易说
Dim message = New Message With { .Command = Command.Request, .Device = &hF, .Count = 8, .Filter = &h1234 }
Dim bytes = message.GetBytes()
' Hex for debugging
Dim hex = BitConverter.ToString(bytes)
你只需要布局消息的结构。一种方法是LayoutKind.Explicit
。我可能会选择与设备文档最接近的LayoutKind。
Public Enum Command As Byte
Reset = 0
Request = 1
End Enum
<StructLayout(LayoutKind.Explicit)>
Public Structure Message
<FieldOffset(0)> Public Command As Command
<FieldOffset(1)> Public Device As Byte
' unused bytes default to 0
<FieldOffset(10)> Public Count As UInt16
<FieldOffset(12)> Public Filter As Int16
Public Function GetBytes() As Byte()
Dim rawData(0 To Marshal.SizeOf(Me) - 1) As Byte
Dim handle = GCHandle.Alloc(rawData, GCHandleType.Pinned)
Try
Dim rawDataPtr = handle.AddrOfPinnedObject()
Marshal.StructureToPtr(Me, rawDataPtr, False)
Return rawData
Finally
handle.Free()
End Try
End Function
End Structure
'TODO define enums, etc to make it easier for caller.
'TODO update struct per device documentation
我真的不明白你想通过将字节转换为字节数组来达到目的。你可以解释吗?你发送的'Byte'数组中的那两个位置究竟代表什么?实际上没有'BitConverter.GetBytes'的重载,它有一个'Byte'类型的参数,所以实际发生的情况是你的'count'被隐式转换为'Integer',然后你得到一个四字节的文件,字节表示,这将只是三个零和您的原始值在最不重要的位置。 – jmcilhinney
这个问题的症结正是你的接收器所期望的,你没有向我们解释这个问题,而且你自己甚至都不明白,所以你需要做的是研究这个问题。我们无法帮助。 – jmcilhinney