Как считать Массив Delphi Фиксированных Размерных Строк в упакованной записи в c#

Я должен считать поле блоба из базы данных в c# приложение.

Однако поле блоба было записано в базу данных Приложением Delphi с помощью следующего метода:

 procedure WriteABlob(Blob : TBlobField; var Buffer; size : integer);
 var 
     s : String;
 begin
     setlength(s,size);
     move(buffer,s[1],Size);
     Blob.Value := S;
 end;

Структура, записанная в базу данных, не является простой структурой и содержит вещи как

MyVariable : Array[0..3] of String[80];

или хуже некоторые из них содержат

MyRecord = Packed Record
case byte of
    1: (
        iValue:Integer;
       )
    2: (
        cValue:Char;
       )
end;

Я пытался читать в байтах из базы данных и затем использования

Marshal.PtrToStructure()

для перемещения его в структуру

Моя Структура определяется следующим образом:

    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 1, Size = 10710)]
    public struct MyBlobField
    {
        ...
        [MarshalAs(UnmanagedType.ByValArray, ArraySubType = UnmanagedType.AnsiBStr,SizeConst = SpecificArraySize)]
        public String[] ArrayofFixedLengthStrings;
        ...
    }

Но я получаю ошибку при вызове Маршала. PtrToStructure ():

Не может упорядочить поле 'ArrayofFixedLengthStrings' типа 'MyBlobField': Недопустимая управляемая/неуправляемая комбинация типа (Строка [] должна быть соединена с ArraySubType LPStr, LPWStr, BStr или LPTStr).

Я задавался вопросом, был ли атрибут, я мог бы определить на CustomMarshaler, который принял бы соединение со Строкой []

Какие-либо идеи, как я мог считать содержание блоба в c#?

8
задан RRUZ 3 February 2010 в 17:17
поделиться

2 ответа

Разобрался ...

Объявлена ​​структура String20 как

    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 1)]
    public struct String20
    {
        [MarshalAs(UnmanagedType.U1)]
        public byte StringSize;
        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 20)]
        public String Value;
    }

По-видимому, идентификатор размера строки в начале строки фиксированной длины (например, delphi ShortString) составляет всего 1 байт. Затем определение header_identifiers было изменено на:

       [MarshalAs(UnmanagedType.ByValArray, SizeConst = max_header_identifiers)]
        public String20[] header_identifiers;

Также обнаружено, что Delphi Packed Boolean необходимо преобразовать как

[MarshalAs(UnmanagedType.I1)]
public bool BooleanVar;
2
ответ дан 6 December 2019 в 01:40
поделиться

Вот как получить синтаксис декоратора Jerub упомянул

def timeout(limit=None):
    if limit is None:
        limit = DEFAULT_TIMEOUT
    if limit <= 0:
        raise TimeoutError() # why not ValueError here?
    def wrap(function):
        return _Timeout(function,limit)
    return wrap

@timeout(15)
def mymethod(): pass
-121--1540324-

Это не совсем так, как он работает, tr: first-child ol выбирает tr , который является первым нижестоящим элементом его родительского элемента. Вместо этого необходимо использовать псевдокласс first-child в td .

-121--2579275-

Мой первый комментарий заключается в том, что «String [80]» является последовательностью фиксированной длины (которая должна быть проще в структуре), и в C # вы пытаетесь поместить ее в «String []» - которая фактически является ссылкой (указателем) на последовательность.

Мой следующий комментарий заключается в том, что в худшем случае вы можете попробовать прочесть его в массив байтов и вытащить нужные вам байты и манипулировать ими в структуру назначения.

0
ответ дан 6 December 2019 в 01:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: