1

PC で文字列を受け取ります。これは基本的に、バイトごとにいくつかの短い文字列のシーケンスです。その文字列を構造体に入れる必要があります。たとえば、Hello!次の構造体 に入れる必要があります。

public struct serialPacket
{
    public ushort first;
    public ushort second;
    public ushort third;
}

このように取得するには:

temp.first=0x6548;
temp.second=0x6c6c;
temp.third=0x216f;

エンディアンについてはよくわかりませんが、今のところ問題ありません。
C/C++ ではポインターを少し使用するだけで簡単に実行できるため、私は本当にイライラしていますが、C# で修正する方法がわかりません。
私はMarshalこれを処理するために使用していますが、結果としていくつかのジャンクが得られます:

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct serialPacket
{
    [MarshalAs(UnmanagedType.U2)]
    public ushort first;
    [MarshalAs(UnmanagedType.U2)]
    public ushort second;
    [MarshalAs(UnmanagedType.U2)]
    public ushort third;
}
...
IntPtr pBuf = Marshal.StringToBSTR(indata);
serialPacket ms = (serialPacket)Marshal.PtrToStructure(pBuf, typeof(serialPacket));
Marshal.FreeBSTR(pBuf);

結果: 1st 101
2nd 72
3rd 108
ushort を 1 バイトずつマーシャリングするように見えます。ストリング自体は、1 回のショットで完全に受信されます。そして最後に 0x0D を NewLine として受け取ります。

4

1 に答える 1

0

これは私のために働いた:

temp.first = 0x6548;
temp.second = 0x6c6c;
temp.third = 0x216f;

Func<ushort, string> conv = u =>
{
    var bs = BitConverter.GetBytes(u);
    return System.Text.ASCIIEncoding.ASCII.GetString(bs);
};

var query =
    from u in new [] { temp.first, temp.second, temp.third, }
    select conv(u);

var result = String.Join("", query);
// result == "Hello!"
于 2012-09-24T03:15:39.687 に答える