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
看起来更像是按单个字节编组撕裂 ushorts。一次性接收完整的字符串本身。最后以 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 回答