新しいソフトウェアで処理するために、(かなり古風な) 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;
}