2017-02-25 8 views
0

私はメッセージビルダを作成しています。その中にデータを要求するリモートマシンにバイト配列を送信する必要があります。バイト配列の各項目のASCIIテーブル番号を表示

私は、要求されたアイテムの数を数え、バイト配列に挿入された数を取得しようとしている8ビットの数を持っています。 バイト配列の位置は、配列の位置が70 & 71であり、リトルエンディアンの順序です。

私はバイトを変換し、変換されたバイトを次のコードで挿入しようとしています。

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

これを1より大きい値にすると、デバイスによって受け入れられません。バイト配列を送信しています。

私は右のボールパークにいるか、まったく間違っています。私は完全にバイトとビットでスピードアップしていません。また、いかなる例または説明も高く評価されるであろう。

+0

'Byte'を' Byte'配列に変換することで達成しようとしていることは本当に分かりません。説明できますか?送信する 'Byte'配列の2つの位置は正確に何を表していますか?実際には 'Byte'型のパラメータを持つ' BitConverter.GetBytes'のオーバーロードはありません。実際には、 'count'が暗黙的に' Integer'に変換されていて、それは3つのゼロとなり、元の値は少なくとも重要な位置になります。 – jmcilhinney

+1

この問題の要点は、レシーバが期待しているものであり、あなたはそれを私たちに説明していないし、見た目も自分自身でさえ理解できないので、あなたがする必要があるのはそれを研究することです。私たちはそれを手助けすることはできません。 – jmcilhinney

答えて

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) 

を言うことが容易ではないでしょうあなただけのメッセージの構造をレイアウトする必要があります。 1つの方法は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 
関連する問題