4

新しいソフトウェアで処理するために、(かなり古風な) C++ 文字列メッセージを C# 構造体にマップしようとしています。私が直面している問題は、C++ 文字列メッセージを C# 構造体にマッピングするときに文字が失われることです (おそらく \0 が追加されます)。

処理する必要があるメッセージ データは次のようになります: "91000222201"

Where:  "91" is one value
        "0002" is the next value
        "222" is the third value
        "01" is the final value

私が試した最初の構造体レイアウトはこれでした:

[StructLayout(LayoutKind.Sequential, Size = 11, CharSet = CharSet.Ansi), Serializable]
public struct HeaderPacketStruct
{
    [MarshalAsAttribute(UnmanagedType.ByValTStr, SizeConst = 2)]
    public string Value1;
    [MarshalAsAttribute(UnmanagedType.ByValTStr, SizeConst = 4)]
    public string Value2;
    [MarshalAsAttribute(UnmanagedType.ByValTStr, SizeConst = 3)]
    public string Value3;
    [MarshalAsAttribute(UnmanagedType.ByValTStr, SizeConst = 2)]
    public string Value4;
}

文字列を処理しました...しかし、次の値になりました:

HeaderPacketStruct.Value1 = "9"
HeaderPacketStruct.Value1 = "000"
HeaderPacketStruct.Value1 = "22"
HeaderPacketStruct.Value1 = "0"

各文字列の SizeConst を +1 (「\0」に対応するため) 上げると、文字が削除され始めました。

HeaderPacketStruct.Value1 = "91"
HeaderPacketStruct.Value1 = "0022"
HeaderPacketStruct.Value1 = "01"
HeaderPacketStruct.Value1 = ""

UnmanagedType.ByValTStr は、文字列の末尾に「\0」があると想定しているようです。これを回避する方法はありますか?

余談ですが、以下の構造体で char[] を使用して動作させることができました。ただし、この構造体は、各値が (構造体内の) 文字列ではなく char[] であるため、操作がはるかに困難です。すべての処理のために char[] を文字列に再マップしなければならないのは本当に苦痛です。

StructLayout(LayoutKind.Sequential, Size = 11, CharSet = CharSet.Ansi), Serializable]
public struct HeaderPacketStruct
{
    [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 2)]
    public char[] Value1;
    [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 4)]
    public char[] Value2;
    [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 3)]
    public char[] Value3;
    [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 2)]
    public char[] Value4;
}
4

2 に答える 2

-2

SizeConstFieldOffsetAttributeに追加したときに、正しいs をケースに追加するだけです。また、文字列のサイズが 11 ではなく 12 で+1あることにも注意してください。これを試してください:"91000222201"

[StructLayout(LayoutKind.Sequential, Size = 12, CharSet = CharSet.Ansi), Serializable]
public struct HeaderPacketStruct
{
    [MarshalAsAttribute(UnmanagedType.ByValTStr, SizeConst = 3), FieldOffset(0)]
    public string Value1;
    [MarshalAsAttribute(UnmanagedType.ByValTStr, SizeConst = 5), FieldOffset(2)]
    public string Value2;
    [MarshalAsAttribute(UnmanagedType.ByValTStr, SizeConst = 4), FieldOffset(6)]
    public string Value3;
    [MarshalAsAttribute(UnmanagedType.ByValTStr, SizeConst = 3), FieldOffset(9)]
    public string Value4;
}
于 2013-09-14T07:14:01.060 に答える