2017-02-25 68 views
0

我正在编写一个消息构建器,并且在其中我必须将字节数组发送到请求数据的远程机器。在字节数组中显示每个项目的ASCII表号

我有一个8位的数字,计数有多少项目被请求(计数),并试图让数字插入到一个字节数组。 字节阵列位置位于阵列的位置并且以小尾序排列。

我想只转换字节,然后插入转换的字节与下面的代码。

Dim count As Byte = 3 
    Dim countbyteArray As Byte() = BitConverter.GetBytes(count) 
    sendBytes(70) = (countbyteArray(0)) 
    sendBytes(71) = (countbyteArray(1)) 

当我这样做对于大于1的任何东西它不会被设备接受我正在发送字节数组。

我是否在正确的球公园或完全错误,因为我不完全加快字节和比特。任何示例或解释将不胜感激。

+0

我真的不明白你想通过将字节转换为字节数组来达到目的。你可以解释吗?你发送的'Byte'数组中的那两个位置究竟代表什么?实际上没有'BitConverter.GetBytes'的重载,它有一个'Byte'类型的参数,所以实际发生的情况是你的'count'被隐式转换为'Integer',然后你得到一个四字节的文件,字节表示,这将只是三个零和您的原始值在最不重要的位置。 – jmcilhinney

+1

这个问题的症结正是你的接收器所期望的,你没有向我们解释这个问题,而且你自己甚至都不明白,所以你需要做的是研究这个问题。我们无法帮助。 – jmcilhinney

回答

0

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 
相关问题