Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Хочу динамический масив байт, альтернатива string и ArrayList
|
|||
|---|---|---|---|
|
#18+
Возник вот какой вопрос: В PPC через RS232 приходит какаято информация. Приходящие пакеты могут быть разной длинны в плоть до 10-100 килобайт. Принимаю все это я кусками в небольшой массив байт и собираю в строку. До этого момента все нормально. Далее при получении очередного куска пакета я проверяю на наличие конца пакета и контрольную сумму, но если строка очень длинная то проверка происходит очень долго и пока я проверяю, следующая часть покета может уже приходить и соответственно я ее не успеваю поймать. Так вот проблема в том, что string очень долго обрабатывается. Пробовал обрабатывать в ArrayList сохраняя в нем, как byte побыстрее конечно, но тоже не фантан, т.к. реально все равно получается массив объектов. Накапливать все то что приходит в обычном фиксированном массиве байтов не реально, т.к. заранее не известно какой длинны может быть посылка. А теперь сам вопрос: есть ли какая-нибудь альтернатива string и ArrayList, т.е. что-нибудь не с фиксированной длинной, быстро обрабатываемое? Т.е. хачу динамический масив байтов. -=<TaReN>=- ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.10.2004, 15:12 |
|
||
|
Хочу динамический масив байт, альтернатива string и ArrayList
|
|||
|---|---|---|---|
|
#18+
System.IO.MemoryStream ? Вроде как оптимизирован должен быть на потоки байтов. -- WBR, Roman S. Golubin -- Стек легко преобразуется в очередь при помощи автомата Калашникова. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.10.2004, 16:49 |
|
||
|
Хочу динамический масив байт, альтернатива string и ArrayList
|
|||
|---|---|---|---|
|
#18+
Вижу два пути. 1. Считать контрольную сумму сразу по ходу приема. 2. Создавать параллельные потоки для вычисления контрольных сумм. т.е. Приняли первый пакет, отправили его на проверку, пока принимали второй, первый проверился. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.10.2004, 06:32 |
|
||
|
Хочу динамический масив байт, альтернатива string и ArrayList
|
|||
|---|---|---|---|
|
#18+
Roman S. GolubinSystem.IO.MemoryStream ? Вроде как оптимизирован должен быть на потоки байтов. System.IO.MemoryStream проверю, посмотрю что получится? Алексей Р.Вижу два пути. 1. Считать контрольную сумму сразу по ходу приема. 2. Создавать параллельные потоки для вычисления контрольных сумм. т.е. Приняли первый пакет, отправили его на проверку, пока принимали второй, первый проверился. Все так и делается Как только приходит очередная часть пакета, я сразу добавляю ее к уже полученным частям пакета и проверяю контрольную сумму. А в это время в другом потоке, в буфер порта собирается очередной кусок пакета. Но пока я проверяю контрольную сумму в давольно таки больших кусках пакета, буфер переполняется. На скорости порта 9600 все еще нормально, но если выставляю скорость 19200 вероятность того что пакет придет достоверный менше 50%. Я уже и с размером буфера порта эксперементировал, выставлял его до 1 Kb не помогло. На большой машине алгаритм отработан и работает. А вот на PPC обработка стринг происходит критически медленно. Я пробовал обрабатывать в масиве байтов таких проблем не возникало, но массив байтов в c# статичен и я не могу быть уверен что заблаговременно установленная размерность массива будет удовлетворять всегда, а устанавливать с очень большим запасом я не могу, т.к. пакеты могут приходить и по 5 байтов ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.10.2004, 09:58 |
|
||
|
Хочу динамический масив байт, альтернатива string и ArrayList
|
|||
|---|---|---|---|
|
#18+
Может быть создавать массив с некоторым запасом и заполнять его данными по мере поступления. При приходе очередной порции проверять её размер и, если не влезает, то создавать новый массив, опять же с запасом, и копировать в него старый при помощи Array.Copy(). А старый прибивать. Примерно то же в принципе делается при наращивании стринга. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.10.2004, 10:43 |
|
||
|
Хочу динамический масив байт, альтернатива string и ArrayList
|
|||
|---|---|---|---|
|
#18+
Не совсем понял логику. Когда ты проверяешь к/с? Попробуй рассмотреть такие варианты. Из буфера чаще забирать данные, и проверять по кусочкам. Каким способом считаешь саму к/с? Может использовать массив длинных чисел и (или) может можно использовать более оптимизированные алгоритмы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.10.2004, 10:48 |
|
||
|
Хочу динамический масив байт, альтернатива string и ArrayList
|
|||
|---|---|---|---|
|
#18+
FDDМожет быть создавать массив с некоторым запасом и заполнять его данными по мере поступления. При приходе очередной порции проверять её размер и, если не влезает, то создавать новый массив, опять же с запасом, и копировать в него старый при помощи Array.Copy(). А старый прибивать. Примерно то же в принципе делается при наращивании стринга. Копирование массивов будет тормозить дело. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.10.2004, 10:52 |
|
||
|
Хочу динамический масив байт, альтернатива string и ArrayList
|
|||
|---|---|---|---|
|
#18+
Алексей Р. FDDМожет быть создавать массив с некоторым запасом и заполнять его данными по мере поступления. При приходе очередной порции проверять её размер и, если не влезает, то создавать новый массив, опять же с запасом, и копировать в него старый при помощи Array.Copy(). А старый прибивать. Примерно то же в принципе делается при наращивании стринга. Копирование массивов будет тормозить дело.Естественно. Но есть ли другой способ получить динамический масив? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.10.2004, 11:15 |
|
||
|
Хочу динамический масив байт, альтернатива string и ArrayList
|
|||
|---|---|---|---|
|
#18+
2 TaReN: Может стоить разделить обработку данных на несколько этапов: 1. Принимаем данные из порта и асинхронно складирует их в Stream; 2. Асинхронно читаем Stream и выделяем пакет 3. Асинхронно напускает проверку контрольной суммы на пакет. 4. Передаем пакет для дальнейшей обработки. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.10.2004, 11:21 |
|
||
|
Хочу динамический масив байт, альтернатива string и ArrayList
|
|||
|---|---|---|---|
|
#18+
Вот вам динамический массив: 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 в шарпе двухбайтный. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.10.2004, 12:34 |
|
||
|
Хочу динамический масив байт, альтернатива string и ArrayList
|
|||
|---|---|---|---|
|
#18+
Алексей Р.Вот вам динамический массив: 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 // Примерно так Не совсем понятно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.10.2004, 14:24 |
|
||
|
Хочу динамический масив байт, альтернатива string и ArrayList
|
|||
|---|---|---|---|
|
#18+
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 промежуточные(временные) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.10.2004, 15:58 |
|
||
|
|

start [/forum/topic.php?fid=20&tid=1438081]: |
0ms |
get settings: |
10ms |
get forum list: |
20ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
74ms |
get topic data: |
13ms |
get forum data: |
4ms |
get page messages: |
64ms |
get tp. blocked users: |
2ms |
| others: | 255ms |
| total: | 450ms |

| 0 / 0 |
