Работа ведётся на C#. Есть байтовый массив bigMas. Он состоит из 2-х частей: команда (24 байта) + данные (очень много байт). Мне надо отделить данные от команды. Сейчас чтобы получить массив данных dataMas я использую функцию Array.Copy:
Для меня критичный параметр — время. Если я буду так обрабатывать сотни приходящих мне массивов, дубликация данных займёт много времени. В C++ можно было бы просто перебросить указатель на 24 байта вперёд. А можно ли подобное сделать на C#? Как? Покажите на кусочке программы, если можно.
Здравствуйте, lesovick, Вы писали:
L>Работа ведётся на C#. Есть байтовый массив bigMas. Он состоит из 2-х частей: команда (24 байта) + данные (очень много байт). Мне надо отделить данные от команды. Сейчас чтобы получить массив данных dataMas я использую функцию Array.Copy:
А что вы потом делаете с dataMas?
L>В C++ можно было бы просто перебросить указатель на 24 байта вперёд.
Т.е. в C++ отделять данные не надо было?
L> А можно ли подобное сделать на C#? Как? Покажите на кусочке программы, если можно.
можно, но это будет именно указатель, а не полноценный массив. Указатель устроит?
А откуда этот пакет к Вам приходит? Может его можно сразу получать в виде двух массивов? Например, у сокетов есть методы принимающие список буферов, при фиксированном размере заголовка вполне подойдёт.
Здравствуйте, Jolly Roger, Вы писали:
JR>А откуда этот пакет к Вам приходит? Может его можно сразу получать в виде двух массивов? Например, у сокетов есть методы принимающие список буферов, при фиксированном размере заголовка вполне подойдёт.
Всё верно, я так теперь и делаю. Просто мне стало интересно, как выглядит решение этой проблемы именно с использованием указателей на C#.
Теперь p указывает на i1[1] = 2. А как мне теперь создать массив i2[4], который будет указывать на i1, начиная со второго элемента, с помощью указателя p?
Здравствуйте, lesovick, Вы писали:
L>Теперь p указывает на i1[1] = 2. А как мне теперь создать массив i2[4], который будет указывать на i1, начиная со второго элемента, с помощью указателя p?
Здравствуйте, lesovick, Вы писали:
L>А как мне теперь создать массив i2[4], который будет указывать на i1, начиная со второго элемента, с помощью указателя p?
Ровно так-же, как и на любом другом языке — копированием. Только зачем его создавать?
Здравствуйте, Jolly Roger, Вы писали:
JR>Здравствуйте, lesovick, Вы писали:
L>>А как мне теперь создать массив i2[4], который будет указывать на i1, начиная со второго элемента, с помощью указателя p?
JR>Ровно так-же, как и на любом другом языке — копированием. Только зачем его создавать?
Ну, например, мне надо тот же dataMas представить, как строку. До сих пор я делал это так:
String s = Encoding.ASCII.GetString(dataMas);
А что мне делать с указателем на 24-й элемент bigMas??
Резюме: как, имея указатель на 24-й элемент массива bigMas и зная длину bigMas, создать строку, начинающуюся этим 24-м элементом и заканчивающуюся концом массива bigMas, НЕ ПРОИЗВОДЯ КОПИРОВАНИЕ?
Здравствуйте, lesovick, Вы писали:
L>Ну, например, мне надо тот же dataMas представить, как строку. До сих пор я делал это так: L>
L>String s = Encoding.ASCII.GetString(dataMas);
L>
L>А что мне делать с указателем на 24-й элемент bigMas??
Ну например сделать так
String s = Encoding.ASCII.GetString(dataMas, 1 dataMas.Length - 1);
L>Резюме: как, имея указатель на 24-й элемент массива bigMas и зная длину bigMas, создать строку, начинающуюся этим 24-м элементом и заканчивающуюся концом массива bigMas, НЕ ПРОИЗВОДЯ КОПИРОВАНИЕ?
JR>String s = Encoding.ASCII.GetString(dataMas, 1 dataMas.Length - 1);
JR>
Что ж, как я уже сказал, задача состоит в создании СТРОКИ из УКАЗАТЕЛЯ, и чтобы при этом НЕ ПРОИЗВОДИТЬ КОПИРОВАНИЕ. А функция Encoding.ASCII.GetString как раз и занимается копированием, которое занимает значительное время и от которого я и пытаюсь избавиться...
Здравствуйте, lesovick, Вы писали:
JR>>Ну например сделать так
JR>>
JR>>String s = Encoding.ASCII.GetString(dataMas, 1 dataMas.Length - 1);
JR>>
L>Что ж, как я уже сказал, задача состоит в создании СТРОКИ из УКАЗАТЕЛЯ, и чтобы при этом НЕ ПРОИЗВОДИТЬ КОПИРОВАНИЕ. А функция Encoding.ASCII.GetString как раз и занимается копированием, которое занимает значительное время и от которого я и пытаюсь избавиться...
Дотнет строка не может быть получена из указателя на ASCII буфер просто потому что она имеет другую природу (по 2 байта на символ). Потому тут даже копированием не обойтись. ASCII.GetString делает несколько больше работы — она конвертирует.
Значительное время в каких порядках измеряется? Что-то мне подсказывает что оно не сопоставимо со скоростью получения данных из файла, или по сетевому интерфейсу.