Возможно, хранение номера телефона разделяет в различных столбцах, допуская пустые или пустые записи?
В итоге я использовал массив байтов в качестве представления структуры и использовал построитель для установки значений. Прирост в производительности небольшой, но он есть. И есть преимущества памяти, так как я могу закрепить ее в памяти и отправить прямо в неуправляемую процедуру. На самом деле это помогает мне с другой проблемой: эта структура имеет две версии с разными xumrdadosc10000 размерами ... исходная - 10000 байт, но новая - 200000 байт, но имя то же самое для совместимости целей. Итак, я могу создать нужный размер в конструкторе, и вперед.
/// <summary>Builds PXUCAMR/PXUCAMRV3 as a byte array.</summary>
internal class PxucamrBuilder
{
internal byte[] Pxucamr;
/// <summary>Get/set field xumrversaocomc01, offset 0, size 1 byte.</summary>
internal string StructureVersion
{
get { return Encoding.ASCII.GetString(this.Pxucamr, 0, 1); }
set { Encoding.ASCII.GetBytes(value, 0, 1, this.Pxucamr, 0); }
}
/// <summary>Get/set field xumrambientec01, offset 12, size 1 byte.</summary>
internal string Context
{
get { return Encoding.ASCII.GetString(this.Pxucamr, 12, 1); }
set { Encoding.ASCII.GetBytes(value, 0, 1, this.Pxucamr, 12); }
}
/// <summary>Get/set field xumrcodfalhac05, offset 5, size 5 byte.</summary>
internal string ErrorCode
{
get { return Encoding.ASCII.GetString(this.Pxucamr, 5, 5); }
set { Encoding.ASCII.GetBytes(value, 0, 5, this.Pxucamr, 5); }
}
/// <summary>Get/set field xumridservidorc30, offset 130, size 30 bytes.</summary>
internal string ServerId
{
get { return Encoding.ASCII.GetString(this.Pxucamr, 130, 30); }
set { Encoding.ASCII.GetBytes(value, 0, value.Length, this.Pxucamr, 130); }
}
/// <summary>Get/set field xumrtamdadosb31, offset 24, size 4 byte.</summary>
internal int DataSize
{
get
{
byte[] bytes = new byte[4];
Array.Copy(this.Pxucamr, 24, bytes, 0, 4);
return this.ByteArrayToInt32(bytes);
}
set
{
byte[] bytes = this.Int32ToByteArray(value);
Array.Copy(bytes, 0, this.Pxucamr, 24, 4);
}
}
/* ... same pattern to remaining fields ... */
}
Смещения можно легко найти с помощью метода Marshal.OffsetOf .
Поскольку я использую этот, я отмечу этот ответ как правильный. Но я могу изменить это, если появится лучший ответ. Я все еще готов пробовать новые идеи!
When you tried with "strings to no avail" what happened? It crashed? Didn't map properly? Missed some fields?
I've used the following constructs in the past...
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
public struct PXUCAMR
{
[MarshalAs(UnmanagedType.I1)]
public sbyte xumrversaocomc01;
// null terminated string?
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 5)]
public string xumrcodfalhac05;
// or just raw data?
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 5)]
public sbyte[] xumrcodfalhac05;
}
The CharSet.Ansi is needed for the ByValTStr setting. If xumrcodfalhac05 is really data and not a string, use the sbyte array.