我正在编写一个Message构建器,在其中我必须将一个字节数组发送到请求数据的远程机器。
我有一个8位数,用于计算请求的项目数(计数),并尝试将数字插入字节数组。 字节阵列位置位于70和70的位置。数组的71和小端序。
我正在尝试转换字节,然后使用以下代码插入转换后的字节。
Dim count As Byte = 3
Dim countbyteArray As Byte() = BitConverter.GetBytes(count)
sendBytes(70) = (countbyteArray(0))
sendBytes(71) = (countbyteArray(1))
当我对大于1的任何内容执行此操作时,我发送字节数组的设备无法接受它。
我是否在正确的球场或完全错误,因为我没有完全达到Bytes和Bits的速度。此外,任何例子或解释都将非常感激。
答案 0 :(得分:0)
小端是.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