Я пытаюсь сопоставить (довольно архаичное) строковое сообщение C++ в C# struct для обработки в каком-то новом программном обеспечении. Проблема, с которой я сталкиваюсь, заключается в том, что при сопоставлении строкового сообщения C++ в структуру C# я теряю символы (предположительно добавляя \ 0).Проблемы с struct mapping в C# для строк
данныхсообщение мне нужно процесс выглядит следующим образом: «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 (до ac вещная ссуда для «\ 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;
}
Не было бы намного проще отобразить его на одну строку/полукокса [] поле и разобрать его с некоторыми свойствами только для чтения ? –
В этом интерфейсе есть порядка 40 сообщений, и большинство из них - 70 + полей. Я думаю, что было бы намного проще и удобнее иметь выделенные структуры, в которых я могу сопоставить строки, чем синтаксический анализ каждого поля сообщения по полю. – typhoid
ОК, это много. Но так же поддерживается 40 из этих структур компоновки. И последний, с char [], является прямым переводом того, что у вас есть в качестве входных данных. Я не думаю, что Маршал может много постобработки. Не его работа. –