Это потому, что установлены только первые элементы ваших массивов char, а остальные равны нулю (вы можете увидеть это в окне Memory).
Прежде всего, пытаясь заполнить массив char необработанным двоичные данные могут привести к нежелательным и непредсказуемым результатам, если только мы не можем указать точную кодировку. Вы можете увидеть поверх структуры, что CharSet установлен в Ansi, 1 байт на символ.
Затем, вместо использования массивов символов с фиксированным указателем, вы можете использовать строки, но упорядочить их по значению и с точным размер.
Пожалуйста, дайте мне знать, если это поможет:
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 1)]
public unsafe struct Establish503
{
public static Establish503 ReinterpretCast(byte[] message)
{
GCHandle handle = GCHandle.Alloc(message, GCHandleType.Pinned);
Establish503 theStruct = (Establish503)Marshal.PtrToStructure(handle.AddrOfPinnedObject(),
typeof(Establish503));
handle.Free();
return theStruct;
}
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)]
public string HMACSignature;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 20)]
public string AccessKey;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 30)]
public string TradingSystemName;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 10)]
public string TradingSystemVersion;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 10)]
public string TradingSystemVendor;
}
ОБНОВЛЕНИЕ 1: ОП также задал дополнительный вопрос в комментарии ниже, поэтому ответ обновляется.
ОП хочет знать, что если в текущую встроена другая структура с полем Int64.
Сначала читаем: https://docs.microsoft.com/en-us/dotnet/framework/interop/default-marshaling-behavior#default -marshaling-for-value-types
Итак, я добавил эту новую структуру в исходный код:
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 1)]
public struct Data
{
[MarshalAs(UnmanagedType.I8)]
public long LongField;
}
Затем вставил ее в текущую:
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 1)]
public unsafe struct Establish503
{
public static Establish503 ReinterpretCast(byte[] message)
{
GCHandle handle = GCHandle.Alloc(message, GCHandleType.Pinned);
Establish503 theStruct = (Establish503)Marshal.PtrToStructure(handle.AddrOfPinnedObject(),
typeof(Establish503));
handle.Free();
return theStruct;
}
public Data DataStruct;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)]
public string HMACSignature;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 20)]
public string AccessKey;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 30)]
public string TradingSystemName;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 10)]
public string TradingSystemVersion;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 10)]
public string TradingSystemVendor;
}
И, наконец, маршалировал обратно из неуправляемой памяти:
Establish503 establish503 = Establish503.ReinterpretCast(new byte[] {
1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20,
1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20,
1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20,
1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20,
1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20,
1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20
});