显示字节数组中每个项目的ASCII表编号

时间:2017-02-25 20:29:18

标签: vb.net

我正在编写一个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的速度。此外,任何例子或解释都将非常感激。

1 个答案:

答案 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