Как отсечь ненужную часть массива?
От: lesovick Россия  
Дата: 23.03.10 06:54
Оценка:
Работа ведётся на C#. Есть байтовый массив bigMas. Он состоит из 2-х частей: команда (24 байта) + данные (очень много байт). Мне надо отделить данные от команды. Сейчас чтобы получить массив данных dataMas я использую функцию Array.Copy:


Array.Copy(bigMas, 24, dataMas, 0, (bigMas.Length - 24));


Для меня критичный параметр — время. Если я буду так обрабатывать сотни приходящих мне массивов, дубликация данных займёт много времени. В C++ можно было бы просто перебросить указатель на 24 байта вперёд. А можно ли подобное сделать на C#? Как? Покажите на кусочке программы, если можно.
Re: Как отсечь ненужную часть массива?
От: samius Япония http://sams-tricks.blogspot.com
Дата: 23.03.10 07:07
Оценка:
Здравствуйте, lesovick, Вы писали:

L>Работа ведётся на C#. Есть байтовый массив bigMas. Он состоит из 2-х частей: команда (24 байта) + данные (очень много байт). Мне надо отделить данные от команды. Сейчас чтобы получить массив данных dataMas я использую функцию Array.Copy:


А что вы потом делаете с dataMas?

L>В C++ можно было бы просто перебросить указатель на 24 байта вперёд.


Т.е. в C++ отделять данные не надо было?

L> А можно ли подобное сделать на C#? Как? Покажите на кусочке программы, если можно.


можно, но это будет именно указатель, а не полноценный массив. Указатель устроит?
Re: Как отсечь ненужную часть массива?
От: Jolly Roger  
Дата: 23.03.10 07:15
Оценка:
Здравствуйте, lesovick, Вы писали:

А откуда этот пакет к Вам приходит? Может его можно сразу получать в виде двух массивов? Например, у сокетов есть методы принимающие список буферов, при фиксированном размере заголовка вполне подойдёт.
"Нормальные герои всегда идут в обход!"
Re[2]: Как отсечь ненужную часть массива?
От: lesovick Россия  
Дата: 23.03.10 12:17
Оценка:
Здравствуйте, samius, Вы писали:

S>можно, но это будет именно указатель, а не полноценный массив. Указатель устроит?


Указатель устроит.
Re[3]: Как отсечь ненужную часть массива?
От: samius Япония http://sams-tricks.blogspot.com
Дата: 23.03.10 12:20
Оценка:
Здравствуйте, lesovick, Вы писали:

L>Указатель устроит.

fixed (byte* p = &dataMas[24])
{
    ...
}
Re[2]: Как отсечь ненужную часть массива?
От: lesovick Россия  
Дата: 23.03.10 12:23
Оценка: :)
Здравствуйте, Jolly Roger, Вы писали:

JR>А откуда этот пакет к Вам приходит? Может его можно сразу получать в виде двух массивов? Например, у сокетов есть методы принимающие список буферов, при фиксированном размере заголовка вполне подойдёт.


Всё верно, я так теперь и делаю. Просто мне стало интересно, как выглядит решение этой проблемы именно с использованием указателей на C#.
Re[4]: Как отсечь ненужную часть массива?
От: lesovick Россия  
Дата: 24.03.10 08:07
Оценка:
Пусть будет такой пример:
            int[] i1 = new int[5];
            i1[0] = 1;
            i1[1] = 2;
            i1[2] = 3;
            i1[3] = 4;
            i1[4] = 5;
            fixed (int* p = &i1[1])
            {
                
            }

Теперь p указывает на i1[1] = 2. А как мне теперь создать массив i2[4], который будет указывать на i1, начиная со второго элемента, с помощью указателя p?
Re[5]: Как отсечь ненужную часть массива?
От: nikov США http://www.linkedin.com/in/nikov
Дата: 24.03.10 08:40
Оценка:
Здравствуйте, lesovick, Вы писали:

L>Теперь p указывает на i1[1] = 2. А как мне теперь создать массив i2[4], который будет указывать на i1, начиная со второго элемента, с помощью указателя p?


Массивы не могут куда-то указывать.
Re[5]: Как отсечь ненужную часть массива?
От: Jolly Roger  
Дата: 24.03.10 08:40
Оценка:
Здравствуйте, lesovick, Вы писали:

L>А как мне теперь создать массив i2[4], который будет указывать на i1, начиная со второго элемента, с помощью указателя p?


Ровно так-же, как и на любом другом языке — копированием. Только зачем его создавать?
"Нормальные герои всегда идут в обход!"
Re[6]: Как отсечь ненужную часть массива?
От: lesovick Россия  
Дата: 24.03.10 10:03
Оценка:
Здравствуйте, Jolly Roger, Вы писали:

JR>Здравствуйте, lesovick, Вы писали:


L>>А как мне теперь создать массив i2[4], который будет указывать на i1, начиная со второго элемента, с помощью указателя p?


JR>Ровно так-же, как и на любом другом языке — копированием. Только зачем его создавать?


Ну, например, мне надо тот же dataMas представить, как строку. До сих пор я делал это так:
String s = Encoding.ASCII.GetString(dataMas);

А что мне делать с указателем на 24-й элемент bigMas??

Резюме: как, имея указатель на 24-й элемент массива bigMas и зная длину bigMas, создать строку, начинающуюся этим 24-м элементом и заканчивающуюся концом массива bigMas, НЕ ПРОИЗВОДЯ КОПИРОВАНИЕ?
Re[7]: Как отсечь ненужную часть массива?
От: Jolly Roger  
Дата: 24.03.10 10:09
Оценка:
Здравствуйте, 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, НЕ ПРОИЗВОДЯ КОПИРОВАНИЕ?


Не, резюме такое:
"Документацию читать надо"
"Нормальные герои всегда идут в обход!"
Re[8]: Как отсечь ненужную часть массива?
От: lesovick Россия  
Дата: 25.03.10 08:29
Оценка:
JR>Ну например сделать так

JR>
JR>String s = Encoding.ASCII.GetString(dataMas, 1 dataMas.Length - 1);
JR>


Что ж, как я уже сказал, задача состоит в создании СТРОКИ из УКАЗАТЕЛЯ, и чтобы при этом НЕ ПРОИЗВОДИТЬ КОПИРОВАНИЕ. А функция Encoding.ASCII.GetString как раз и занимается копированием, которое занимает значительное время и от которого я и пытаюсь избавиться...
Re[9]: Как отсечь ненужную часть массива?
От: samius Япония http://sams-tricks.blogspot.com
Дата: 25.03.10 10:51
Оценка: +1
Здравствуйте, lesovick, Вы писали:

JR>>Ну например сделать так


JR>>
JR>>String s = Encoding.ASCII.GetString(dataMas, 1 dataMas.Length - 1);
JR>>


L>Что ж, как я уже сказал, задача состоит в создании СТРОКИ из УКАЗАТЕЛЯ, и чтобы при этом НЕ ПРОИЗВОДИТЬ КОПИРОВАНИЕ. А функция Encoding.ASCII.GetString как раз и занимается копированием, которое занимает значительное время и от которого я и пытаюсь избавиться...


Дотнет строка не может быть получена из указателя на ASCII буфер просто потому что она имеет другую природу (по 2 байта на символ). Потому тут даже копированием не обойтись. ASCII.GetString делает несколько больше работы — она конвертирует.

Значительное время в каких порядках измеряется? Что-то мне подсказывает что оно не сопоставимо со скоростью получения данных из файла, или по сетевому интерфейсу.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.