powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Хочу динамический масив байт, альтернатива string и ArrayList
13 сообщений из 13, страница 1 из 1
Хочу динамический масив байт, альтернатива string и ArrayList
    #32746602
TaReN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Возник вот какой вопрос:
В PPC через RS232 приходит какаято информация. Приходящие пакеты могут быть разной длинны в плоть до 10-100 килобайт. Принимаю все это я кусками в небольшой массив байт и собираю в строку. До этого момента все нормально. Далее при получении очередного куска пакета я проверяю на наличие конца пакета и контрольную сумму, но если строка очень длинная то проверка происходит очень долго и пока я проверяю, следующая часть покета может уже приходить и соответственно я ее не успеваю поймать.
Так вот проблема в том, что string очень долго обрабатывается. Пробовал обрабатывать в ArrayList сохраняя в нем, как byte побыстрее конечно, но тоже не фантан, т.к. реально все равно получается массив объектов. Накапливать все то что приходит в обычном фиксированном массиве байтов не реально, т.к. заранее не известно какой длинны может быть посылка.
А теперь сам вопрос: есть ли какая-нибудь альтернатива string и ArrayList, т.е. что-нибудь не с фиксированной длинной, быстро обрабатываемое? Т.е. хачу динамический масив байтов.


-=<TaReN>=-
...
Рейтинг: 0 / 0
Хочу динамический масив байт, альтернатива string и ArrayList
    #32746884
Фотография Roman S. Golubin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
System.IO.MemoryStream ? Вроде как оптимизирован должен быть на потоки байтов.

--
WBR,
Roman S. Golubin
--
Стек легко преобразуется в очередь при помощи автомата Калашникова.
...
Рейтинг: 0 / 0
Хочу динамический масив байт, альтернатива string и ArrayList
    #32747512
Алексей Р.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вижу два пути.

1. Считать контрольную сумму сразу по ходу приема.

2. Создавать параллельные потоки для вычисления контрольных сумм.
т.е. Приняли первый пакет, отправили его на проверку, пока принимали второй, первый проверился.
...
Рейтинг: 0 / 0
Хочу динамический масив байт, альтернатива string и ArrayList
    #32749671
TaReN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Roman S. GolubinSystem.IO.MemoryStream ? Вроде как оптимизирован должен быть на потоки байтов.
System.IO.MemoryStream проверю, посмотрю что получится?

Алексей Р.Вижу два пути.

1. Считать контрольную сумму сразу по ходу приема.

2. Создавать параллельные потоки для вычисления контрольных сумм.
т.е. Приняли первый пакет, отправили его на проверку, пока принимали второй, первый проверился.
Все так и делается Как только приходит очередная часть пакета, я сразу добавляю ее к уже полученным частям пакета и проверяю контрольную сумму. А в это время в другом потоке, в буфер порта собирается очередной кусок пакета. Но пока я проверяю контрольную сумму в давольно таки больших кусках пакета, буфер переполняется. На скорости порта 9600 все еще нормально, но если выставляю скорость 19200 вероятность того что пакет придет достоверный менше 50%. Я уже и с размером буфера порта эксперементировал, выставлял его до 1 Kb не помогло.
На большой машине алгаритм отработан и работает. А вот на PPC обработка стринг происходит критически медленно. Я пробовал обрабатывать в масиве байтов таких проблем не возникало, но массив байтов в c# статичен и я не могу быть уверен что заблаговременно установленная размерность массива будет удовлетворять всегда, а устанавливать с очень большим запасом я не могу, т.к. пакеты могут приходить и по 5 байтов
...
Рейтинг: 0 / 0
Хочу динамический масив байт, альтернатива string и ArrayList
    #32749797
FDD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FDD
Гость
Может быть создавать массив с некоторым запасом и заполнять его данными по мере поступления. При приходе очередной порции проверять её размер и, если не влезает, то создавать новый массив, опять же с запасом, и копировать в него старый при помощи Array.Copy(). А старый прибивать. Примерно то же в принципе делается при наращивании стринга.
...
Рейтинг: 0 / 0
Хочу динамический масив байт, альтернатива string и ArrayList
    #32749806
Алексей Р.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не совсем понял логику. Когда ты проверяешь к/с?

Попробуй рассмотреть такие варианты.
Из буфера чаще забирать данные, и проверять по кусочкам.
Каким способом считаешь саму к/с? Может использовать массив длинных чисел и (или) может можно использовать более оптимизированные алгоритмы.
...
Рейтинг: 0 / 0
Хочу динамический масив байт, альтернатива string и ArrayList
    #32749817
Алексей Р.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FDDМожет быть создавать массив с некоторым запасом и заполнять его данными по мере поступления. При приходе очередной порции проверять её размер и, если не влезает, то создавать новый массив, опять же с запасом, и копировать в него старый при помощи Array.Copy(). А старый прибивать. Примерно то же в принципе делается при наращивании стринга.

Копирование массивов будет тормозить дело.
...
Рейтинг: 0 / 0
Хочу динамический масив байт, альтернатива string и ArrayList
    #32749873
FDD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FDD
Гость
Алексей Р. FDDМожет быть создавать массив с некоторым запасом и заполнять его данными по мере поступления. При приходе очередной порции проверять её размер и, если не влезает, то создавать новый массив, опять же с запасом, и копировать в него старый при помощи Array.Copy(). А старый прибивать. Примерно то же в принципе делается при наращивании стринга.

Копирование массивов будет тормозить дело.Естественно. Но есть ли другой способ получить динамический масив?
...
Рейтинг: 0 / 0
Хочу динамический масив байт, альтернатива string и ArrayList
    #32749895
Фотография Roman S. Golubin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 TaReN:

Может стоить разделить обработку данных на несколько этапов:
1. Принимаем данные из порта и асинхронно складирует их в Stream;
2. Асинхронно читаем Stream и выделяем пакет
3. Асинхронно напускает проверку контрольной суммы на пакет.
4. Передаем пакет для дальнейшей обработки.
...
Рейтинг: 0 / 0
Хочу динамический масив байт, альтернатива string и ArrayList
    #32750156
Алексей Р.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот вам динамический массив:

int[] m = new int[4096]; // Этот массив назову строкой
object[] o = new object[50]; // Массив строк // всего примерно можем обслужить от 0 до 2*4096*50=409600байт

//Заполнение строки данными
m[0] = 200;
m[1] = 10;//...

// присоединить строку к массиву
o[0] = (object)m;

// Извлечение данных
int[] m1;
m1 = (int[]) o[0];
int j = m1[0]; // j => 200
// Примерно так


И еще не надо забывать, что string в шарпе двухбайтный.
...
Рейтинг: 0 / 0
Хочу динамический масив байт, альтернатива string и ArrayList
    #32752885
FDD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FDD
Гость
Алексей Р.Вот вам динамический массив:

int[] m = new int[4096]; // Этот массив назову строкой
object[] o = new object[50]; // Массив строк // всего примерно можем обслужить от 0 до 2*4096*50=409600байт

//Заполнение строки данными
m[0] = 200;
m[1] = 10;//...

// присоединить строку к массиву
o[0] = (object)m;
50 массивов? Не думаю, что это удобно. Вопрос был, насколько я понимаю, о непрерывном байтовом массиве.

Алексей Р.
// Извлечение данных
int[] m1;
m1 = (int[]) o[0];
int j = m1[0]; // j => 200
// Примерно так
Не совсем понятно.
...
Рейтинг: 0 / 0
Хочу динамический масив байт, альтернатива string и ArrayList
    #32753175
Алексей Р.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FDD Алексей Р.Вот вам динамический массив:

int[] m = new int[4096]; // Этот массив назову строкой
object[] o = new object[50]; // Массив строк // всего примерно можем обслужить от 0 до 2*4096*50=409600байт

//Заполнение строки данными
m[0] = 200;
m[1] = 10;//...

// присоединить строку к массиву
o[0] = (object)m;
50 массивов? Не думаю, что это удобно. Вопрос был, насколько я понимаю, о непрерывном байтовом массиве.

Алексей Р.
// Извлечение данных
int[] m1;
m1 = (int[]) o[0];
int j = m1[0]; // j => 200
// Примерно так
Не совсем понятно.


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

Что не понятно? В первом случае записали число в массив во втором считали.
// Извлечение данных
...
m1[0] // => 200
m1[1] // => 50
...
массивы m m1 промежуточные(временные)
...
Рейтинг: 0 / 0
Хочу динамический масив байт, альтернатива string и ArrayList
    #32753183
Алексей Р.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Прошу прощения
...
m1[0] // => 200
m1[1] // => 10
...
...
Рейтинг: 0 / 0
13 сообщений из 13, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Хочу динамический масив байт, альтернатива string и ArrayList
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]