-
Доброго времени суток!
Господа, имеется вот такая чудная структура, подскажите, как конвертнуть в .NET. Особенно в части CASE.
TirdaAttribOctetSeq = record Len: u_short; OctetSeq: array [0..IAS_MAX_OCTET_STRING - 1] of u_char; end;
TirdaAttribUsrStr = record Len: u_char; CharSet: u_char; UsrStr: array [0..IAS_MAX_USER_STRING - 1] of u_char; end;
IAS_SET = record irdaClassName: array [0..IAS_MAX_CLASSNAME - 1] of Char; irdaAttribName: array [0..IAS_MAX_ATTRIBNAME - 1] of Char; irdaAttribType: u_long; irdaAttribute: record case Byte of 0: (irdaAttribInt: Long); 1: (irdaAttribOctetSeq: TirdaAttribOctetSeq); 2: (irdaAttribUsrStr: TirdaAttribUsrStr); end; end;
-
Напрямую даже и не знаю. А вот если из файла читать, так наверное Reader свой делать. Может поможет.
-
хотя наверное как то так struct aa1 { private byte aaa; public byte aa { get { switch (aaa) { case 1: { return 1; } case 0: { return 2; } } return 0; } set { ... } } }
-
> А вот если из файла читать, так наверное Reader свой делать.
Эта структура передается в функцию SetSockOpt. :) Т. е. ее потом еще и хитро запонять нужно. римерно вот так IASSetLen := SizeOf(IASSetBuff); FillChar(IASSetBuff, IASSetLen, 0); pIASSet := PIAS_SET(@IASSetBuff);
with pIASSet^ do begin StrLCopy(irdaClassName, PChar(FIrDATransport.FService), Length(FIrDATransport.FService)); irdaAttribName := 'BABA:BABABA'; irdaAttribType := IAS_ATTRIB_STR; irdaAttribute.irdaAttribUsrStr.Len := 12 end;
-
И вообще, на сколько приспособлена .NET для работы , ну скажем, с сокетами на низком уровне? P.S. Я его родственник, этого NET с M$ вместе взятыми
-
> И вообще, на сколько приспособлена .NET для работы , ну > скажем, с сокетами на низком уровне?
С сокетами не работал, но думаю тут не должно быть проблемм. Там много всяких классов и всякого другого для работы с сокетами. Все, как всегда, зависит от задачи.
-
StructLayout(LayoutKind.Explicit) поможет в части case где-то примерно так:
[StructLayout(LayoutKind.Sequential, CharSet=CharSet.Ansi)]
public struct TirdaAttribOctetSeq
[StructLayout(LayoutKind.Explicit, CharSet=CharSet.Ansi)]
public struct _irdaAttribute
[StructLayout(LayoutKind.Explicit, CharSet=CharSet.Ansi)]
public struct IAS_SET
лень всё переводить, но принцип ясен. вместо цифирей SizeConst=ХХХ должны стоять реальные длины массивов. А смещения полей для атрибутов FieldOffset придётся посчитать на пальцах. Перед использованием обязательно проверить размеры вызовом Marshal.SizeOf
-
самое важное забыл ;)))
[StructLayout(LayoutKind.Explicit, CharSet=CharSet.Ansi)] public struct IAS_SET { [FieldOffset(0)] [MarshalAs(UnmanagedType.ByValTStr, SizeConst=123)] public string irdaClassName; [FieldOffset(123)] [MarshalAs(UnmanagedType.ByValTStr, SizeConst=321)] public string irdaAttribName; [FieldOffset(444)] public UInt32 irdaAttribType; [FieldOffset(448)] public _irdaAttribute irdaAttribute; // это вместо вариантной части }
|