2009-12-01 6 views
0

У нас есть приложение, в котором нам нужно де-сериализовать некоторые данные из одного потока на несколько объектов.Как пройти через массив в C# через несколько вызовов

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

Мы хотим сделать что-то вроде:

void Decode(byte[] Data) 
{ 
    Object0.ExtractMessage(Data); 
    Object1.ExtractMessage(Data); 
    Object2.ExtractMessage(Data); 
    ... 
} 

, где каждый вызов ProcessData знает, с чего начать в массиве. В идеале мы бы сделали это, не передав ссылку DataIx.

Для этого в C++ мы просто передаем указатель в массив, и каждая функция ProcessData будет увеличивать его по мере необходимости.

Каждый класс объектов знает, как его собственные сообщения сериализуются и на которые можно положиться (на C++), чтобы вернуть указатель в начале следующего сообщения в потоке.

Есть ли какой-нибудь встроенный механизм, который мы можем использовать для этого (без перехода unsafe)? Операция - высокая частота (~ 10 кПа) и очень легкий. Мы также не хотим копировать или обрезать массив.

Благодарим за помощь.

+1

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

+0

Я могу, и если нет другого пути, я буду, потому что это также то, как мы это делали в прошлом. Просто интересно, есть ли более аккуратный способ? –

ответ

2

Не могли бы вы просто пройти и вернуть индекс массива? Это в основном все, что указатель в любом случае, смещение от фиксированной памяти.

0

Как обернуть данные в MemoryStream, а затем передать StreamReader в метод ExtractMessage?

0

Я предполагаю, что вам приходят в голову несколько вещей.

Вы можете имитировать действие указателя путем обертывания байта [] в классе, который также поддерживал смещение массива. Всякий раз, когда вы обращаетесь к массиву, вы получаете доступ к нему через класс, возможно, с помощью метода доступа, который возвращает следующий байт, а также увеличивает значение переменной смещения. Экземпляр класса может быть передан между различными вызовами функции ExtractMessage.

Как насчет использования C++/CLI? Это позволит вам использовать знакомые методы C/C++ и, тем не менее, быть непосредственно вызываемым из C# без страшного взаимодействия.

Тогда, конечно, существует опасная небезопасная опция, благодаря которой вы получаете указатель C# на байт [] и выполняете требуемую арифметику указателя.

2

Ну, похоже, вам нужен простой поток (например, просто используйте MemoryStream в качестве обертки вокруг вашего байтового массива: stream = new MemoryStream (data)). Просто заверните байтовый массив в поток, над потоком к следующему элементу.Предпочтительно, что вы не вынуждены сразу загружать всю байтовую матрицу.

Помимо этого вы можете использовать указатели на C# точно так же, как вы делали на C++ (хотя указатели требуют ключевое слово unsafe, и им не рекомендуется)

В качестве альтернативы вы можете просто передать данные и индексную переменную, а затем увеличить индекс (что, по сути, t он такой же, как с помощью указателя, но не нуждается в небезопасном).

+0

Мне нравится идея Stream - цель состоит в том, чтобы сохранить компоненты C и C# системы сообщений, которые выглядят и работают как можно ближе. –

+0

Для некоторых компонентов ... :) –

0

Вы можете создать stream из массива байтов.

Stream stream = new MemoryStream(data); 

Тогда ваш процессор может работать на потоках вместо этого.

Смежные вопросы