С Новым годом! Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.62/26: Рейтинг темы: голосов - 26, средняя оценка - 4.62
0 / 0 / 0
Регистрация: 30.12.2010
Сообщений: 3
1
.NET 2.x

преобразование ref byte в byte[] или в IntPtr без использования неуправляемого кода

30.12.2010, 11:35. Показов 4627. Ответов 4
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
есть COM интерфейс с методом:
C++
1
2
3
  virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE OnReceivePacket( 
            /* [in] */ long dwSize,
            /* [size_is][in] */ BYTE __RPC_FAR *Data) = 0;
на C# он выглядит так:
C#
1
void OnReceivePacket(int dwSize, ref byte Data);
этот интерфейс используется для асинхронного получения данных от COM объекта.
раньше реализация была такая:
C#
1
2
3
4
5
6
7
8
9
10
11
12
  unsafe public void OnReceivePacket(int dwSize, ref byte Data)
  {
       byte[] bData = new byte[dwSize];
       fixed (byte* pData = &Data)
       {
           Marshal.Copy(new IntPtr(pData), bData, 0, dwSize);
       }
       //.....
       // Обработка данных из bData
       //.....
 
   }
все было хорошо, до того момента пока не столкнулись с проблемой запуска приложения с сетевой шары, по умолчанию запрещена загрузка неуправляемого кода :-(

Подскажите как сделать новую реализацию этого метода без использования unsafe?
Как преобразовать ref byte в byte[] или в IntPtr
0
IT_Exp
Эксперт
8794 / 1073 / 104
Регистрация: 17.06.2006
Сообщений: 12,602
Блог
30.12.2010, 11:35
Ответы с готовыми решениями:

Как перевести byte[] или переменную типа IntPtr к типу byte[] (ассемблерные инструкции)?
Наткнулась на проблему, нужно перевести тип IntPtr в массив ассемблерной инструкции. Вот пример...

Пердача byte[] COM-функции, ожидающей ref byte
Привет, наше приложение в C# использует несколько COM-интерфейсов. В одном из них есть метод,...

Нельзя преобразовать тип function(a: byte;b: byte): byte к integer (Списки)
Создать список из целых чисел.Поменять в списке местами максимальный и минимальный элементы...

Преобразовать String в Byte[] без использования Encoding
Всем доброго времени суток :) В общем возникла "проблема" имеем код - byte Send = new byte {...

4
Почетный модератор
Эксперт .NET
8722 / 3674 / 404
Регистрация: 14.06.2010
Сообщений: 4,513
Записей в блоге: 9
30.12.2010, 16:47 2
real_vadim, попробуй так:
C#
1
2
3
4
5
6
7
        public void OnReceivePacket ( int dwSize, IntPtr Data ) {
            byte[] bData = new byte[dwSize];
            Marshal.Copy(Data, bData, 0, dwSize);
            //.....
            // Обработка данных из bData
            //.....
        }
Либо замени IntPtr на ref IntPtr, хотя должно работать с IntPt, т.к. это void *, а ref IntPtr - void **.
0
0 / 0 / 0
Регистрация: 30.12.2010
Сообщений: 3
30.12.2010, 16:50  [ТС] 3
Дело в том что интерфейс фиксированный, и поменять тип аргумента не могу
0
Почетный модератор
Эксперт .NET
8722 / 3674 / 404
Регистрация: 14.06.2010
Сообщений: 4,513
Записей в блоге: 9
30.12.2010, 17:14 4
Попробуй так:
C#
1
2
3
4
5
6
7
8
        public void OnReceivePacket ( int dwSize, ref byte Data ) {
            byte[] bData = new byte[dwSize];
            for (int i = 0; i < 0; i++)
                bData[i] = Marshal.ReadByte(Data, i);
            //.....
            // Обработка данных из bData
            //.....
        }
Но как пальцем в небо, проверить работоспособность негде. Да и сомневаюсь что внутри ReadByte берется указатель на Data, так что скорее всего bData будет == 0.

Без unsafe никак.
0
0 / 0 / 0
Регистрация: 30.12.2010
Сообщений: 3
30.12.2010, 17:40  [ТС] 5
Идея конечно не плохая, но в результате получается мусор :-(
вернее первый элемент совпадает, а дальше непонятные числа
использовал вот этот код:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class Program
{
    static void Main(string[] args)
    {
        byte[] temp = new byte[] { 1, 2, 3, 4, 5 };
        byte[] data = Read(temp.Length, ref temp[0]);
        for (int i = 0; i < data.Length; i++)
        {
            Console.WriteLine(data[0]);
        }
    }
 
    public static byte[] Read(int dwSize, ref byte pData)
    {
        byte[] data = new byte[dwSize];
        for (int i = 0; i < dwSize; i++)
        {
            data[i] = Marshal.ReadByte(pData, i);
        }
        return data;
    }
}
видимо это происходит из-за упаковки примитивных типов

Добавлено через 6 минут
Тогда другой вопрос, как можно изменить автоматически сгенерируемые интерфейсы COM объектов?
0
30.12.2010, 17:40
BasicMan
Эксперт
19315 / 2622 / 84
Регистрация: 17.02.2009
Сообщений: 10,364
Блог
30.12.2010, 17:40
Помогаю со студенческими работами здесь

Как преобразовать IntPtr в изображение, а после в byte[]?
Суть в том, что я хочу выбирать PSD файл, преобразовывать его сразу в картинку и отправлять в...

Unsafe, fixed и ref byte: как это будет выглядеть в C#
Здравствуйте! Есть функция ActiveX компонента GetCurrentImage(ref byte , int len), в варианте для...

UnicodeDecodeError: 'utf8' codec can't decode byte 0x80 - invalid start byte
Добрый день При вызове скрипта вылетает такая ошибка: &quot;UnicodeDecodeError: 'utf8' codec can't...

'utf-8' codec can't decode byte 0xff in position 0: invalid start byte
Работаю с библиотеками PIL и telebot В чем может быть проблема ? Ошибка - 'utf-8' codec can't...

Перевести строку, содержащую данные массива байт (byte[]) в byte[]
Приветствую. Есть такая строка - &quot;&quot; Как её перевести в массив байт? 1. Допустим, что...

Invalid byte 1 of 1-byte UTF-8 sequence - ошибка (Intellij idea)
Есть небольшой проект, точнее, только зачаток, запускается нормально, но при сборке в jar ругается,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Блоги программистов
Как использовать GraphQL в C# с HotChocolate
Programming 05.01.2025
GraphQL — это современный подход к разработке API, который позволяет клиентам запрашивать только те данные, которые им необходимы. Это делает взаимодействие с API более гибким и эффективным по. . .
Модель полного двоичного суматора с помощью логических операций (python)
AlexSky-coder 04.01.2025
def binSum(x:list, y:list): s=^y] p=x and y for i in range(1,len(x)): s. append((x^y)^p) p=(x and y)or(p and (x or y)) return s x=list() y=list()
Это мы не проходили, это нам не задавали...(шес­­­­­­­­­­­­­­­ти­б­и­т­н­ы­й асихронный счётчик с управляющим сигналом заде
Hrethgir 04.01.2025
Асинхронный счётчик на сумматорах (шестиразрядный по числу диодов на плате, но наверное разрядов будет больше - восемь или шестнадцать, а диоды на старшие), так как триггеры прошли тестирование и. . .
Руководство по созданию бота для Телеграм на Python
IT_Exp 04.01.2025
Боты для Телеграм представляют собой автоматизированные программы, которые выполняют различные задачи, взаимодействуя с пользователями через интерфейс мессенджера. В данной статье мы рассмотрим,. . .
Применение компонентов PrimeVue в Vue.js 3 на TypeScript
BasicMan 04.01.2025
Введение в PrimeVue и настройка окружения PrimeVue представляет собой мощную библиотеку компонентов пользовательского интерфейса для Vue. js 3, которая предоставляет разработчикам богатый набор. . .
Как стать Senior developer
cpp_developer 04.01.2025
В современной индустрии разработки программного обеспечения позиция Senior Developer представляет собой не просто следующую ступень карьерной лестницы, а качественно новый уровень профессионального. . .
Что известно о дате выхода Windows 12 и чего от нее ждать
IT_Exp 04.01.2025
В мире технологий постоянно происходят изменения, и операционные системы не являются исключением. Windows 11, выпущенная в октябре 2021 года, принесла множество инноваций и улучшений, но. . .
Что новенького в .NET Core 9
Programming 04.01.2025
Обзор ключевых изменений в . NET Core 9 Платформа . NET Core продолжает активно развиваться, и версия 9 представляет собой значительный шаг вперед в эволюции этой технологии. Новый релиз. . .
Инструкция по установке python3.13.1 в Debian 12
AlexSky-coder 03.01.2025
sudo apt update sudo apt install build-essential zlib1g-dev libncurses5-dev libgdbm-dev libnss3-dev libssl-dev libreadline-dev libffi-dev wget. . .
Затестил триггеры. архив проекта прилагаю с GOA файлами в настройках архиватора проектов.
Hrethgir 03.01.2025
В этот раз нет закольцованности, потому что от неё только глюки, как я понял, логика не вырезанная. Триггеры очень быстрые если верить измерениям с помощью анализатора от Gowin. Есть ещё регистры,. . .
Python в помощь DevOps
IT_Exp 03.01.2025
Причины использования Python в работе DevOps Python стал неотъемлемой частью мира DevOps, и это не случайно. Этот язык программирования обладает множеством преимуществ, которые делают его. . .
Angular vs React vs Vue.js
BasicMan 03.01.2025
О, друзья-разработчики и просто любопытные читатели! Сегодня мы отправимся в увлекательное путешествие по миру фронтенд-разработки, и первой остановкой станет Angular – этакий строгий немецкий. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru