20 / 20 / 4
Регистрация: 31.10.2010
Сообщений: 1,240
Записей в блоге: 2
1

Работа с byte (Помещение а Variant)

01.06.2015, 10:10. Показов 3202. Ответов 21
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Добрый день.
В C# массив байт и переменная типа байт создаются так:
C#
1
2
byte[] data1 = {0x01, 0x02};
byte data2 = 0x22
. Я эти значения могу передать в функцию на C++, которая примет массив как variant, а byte как byte (typedef unsigned char BYTE).
У меня вопрос. Как эти переменные объявить на самом C++, для передачи в аналогичную функцию?
Я так понимаю массив надо будет конвертировать в VARIANT?
Спасибо.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
01.06.2015, 10:10
Ответы с готовыми решениями:

Из Variant получить массив Byte
Добрый день. У меня есть переменная типа Variant, она содержит значения, скажем 0x55 0x55. Как мне ее конвертировать в массив byte? ...

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

Работа с VARIANT
Добрый день. Есть функция STDMETHODIMP MyClass::InitiateRequest(VARIANT* pVal) { byte mac = { 0x00, 0x8a, 0x0C, 0x98, 0x11, 0x15 }; ...

21
2444 / 1842 / 406
Регистрация: 15.12.2013
Сообщений: 8,241
01.06.2015, 10:13 2
Костяныч, нужно больше кода.
Пока делайте аналогично только вместо byte - unsigned char.
0
20 / 20 / 4
Регистрация: 31.10.2010
Сообщений: 1,240
Записей в блоге: 2
01.06.2015, 11:30  [ТС] 3
S_el, Вот например из C# я вызываю функцию библиотеки на C++:
C#
1
2
3
byte[] data1 = {0x01, 0x02};
byte data2 = 0x22
Class.func(data1, data2);
Сама функция на c++ имеет следующую сигнатуру:
C++
1
func(VARIANT Value, BYTE Type);
Вот я и спрашиваю, как мне параметры "0x01, 0x02" и "0x22" из под C++ передать в эту функцию библиотеки?

Добавлено через 47 минут
Надо ли byte в VARIANT переводить, если да, то как?
0
Заблокирован
01.06.2015, 11:38 4
Цитата Сообщение от Костяныч Посмотреть сообщение
VARIANT
Это не плюсовая штука, точнее она не входит в стандарт, это чисто WinApi-ашный наворот (или VisualStudio-йная)
Вот определение:
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
typedef /* [wire_marshal] */ struct tagVARIANT VARIANT;
 
struct tagVARIANT
    {
    union 
        {
        struct __tagVARIANT
            {
            VARTYPE vt;
            WORD wReserved1;
            WORD wReserved2;
            WORD wReserved3;
            union 
                {
                LONGLONG llVal;
                LONG lVal;
                BYTE bVal;
                SHORT iVal;
                FLOAT fltVal;
                DOUBLE dblVal;
                VARIANT_BOOL boolVal;
                _VARIANT_BOOL bool;
                SCODE scode;
                CY cyVal;
                DATE date;
                BSTR bstrVal;
                IUnknown *punkVal;
                IDispatch *pdispVal;
                SAFEARRAY *parray;
                BYTE *pbVal;
                SHORT *piVal;
                LONG *plVal;
                LONGLONG *pllVal;
                FLOAT *pfltVal;
                DOUBLE *pdblVal;
                VARIANT_BOOL *pboolVal;
                _VARIANT_BOOL *pbool;
                SCODE *pscode;
                CY *pcyVal;
                DATE *pdate;
                BSTR *pbstrVal;
                IUnknown **ppunkVal;
                IDispatch **ppdispVal;
                SAFEARRAY **pparray;
                VARIANT *pvarVal;
                PVOID byref;
                CHAR cVal;
                USHORT uiVal;
                ULONG ulVal;
                ULONGLONG ullVal;
                INT intVal;
                UINT uintVal;
                DECIMAL *pdecVal;
                CHAR *pcVal;
                USHORT *puiVal;
                ULONG *pulVal;
                ULONGLONG *pullVal;
                INT *pintVal;
                UINT *puintVal;
                struct __tagBRECORD
                    {
                    PVOID pvRecord;
                    IRecordInfo *pRecInfo;
                    }   __VARIANT_NAME_4;
                }   __VARIANT_NAME_3;
            }   __VARIANT_NAME_2;
        DECIMAL decVal;
        }   __VARIANT_NAME_1;
    } ;
typedef VARIANT *LPVARIANT;
 
typedef VARIANT VARIANTARG;
 
typedef VARIANT *LPVARIANTARG;


в его составе есть BYTE *pbVal;, используй это как указатель на массив типа BYTE.
А вообще собственно, как ты собрался из шарпа плюсовую функцию вызывать, да ещё пытаясь передать в С++ шарповые переменные... Эту проект CLI ?
0
20 / 20 / 4
Регистрация: 31.10.2010
Сообщений: 1,240
Записей в блоге: 2
01.06.2015, 11:43  [ТС] 5
IBM, я не знаю, но у меня проект на C# + библиотека на C++.
А сейчас на C++ пишу.
Вот так я дату в вариант помещаю
C++
1
2
3
4
VARIANT Value;
  VariantInit(&Value);
  Value.vt = VT_DATE;
  Value.date = Time.Val;
А как с массивом байт быть?
0
Заблокирован
01.06.2015, 12:04 6
Цитата Сообщение от Костяныч Посмотреть сообщение
но у меня проект на C# + библиотека на C++.
Библиотека на плюсках твоя?

Цитата Сообщение от Костяныч Посмотреть сообщение
Value.vt = VT_DATE;
Там вроде было что - то вроде VT_ARRAY
0
20 / 20 / 4
Регистрация: 31.10.2010
Сообщений: 1,240
Записей в блоге: 2
01.06.2015, 13:08  [ТС] 7
IBM, да, на плюсах.
а здесь вместо date что ставить?
C++
1
Value.date = Time.Val;
Добавлено через 3 минуты
IBM, сделал так:
C++
1
2
3
4
5
byte value[2] = {0x00, 0x03};                                                   
  VARIANT V;
  VariantInit(&V);
  V.vt = VT_ARRAY;
  V.pbVal = value.Val;
Выпадает ошибка: E2294 Structure required on left side of . or .*

Добавлено через 57 минут
C++
1
2
3
4
VARIANT Value;
  VariantInit(&Value);
  Value.vt = VT_ARRAY;
  Value.pbVal = value2;
0
Заблокирован
01.06.2015, 13:10 8
Цитата Сообщение от Костяныч Посмотреть сообщение
IBM, да, на плюсах.
Что да, библиотека на плюсах твоя? Ты её писал?
0
20 / 20 / 4
Регистрация: 31.10.2010
Сообщений: 1,240
Записей в блоге: 2
01.06.2015, 13:12  [ТС] 9
IBM, вы вопрос задали, я ответил на него. Вы его снова задаете. Ну ладно, еще раз отвечу подробно: Да, библиотека на плюсах.
Правильный ответ с переводом массива byte в variant описал в последнем посте.
0
Заблокирован
01.06.2015, 13:21 10
Цитата Сообщение от Костяныч Посмотреть сообщение
вы вопрос задали, я ответил на него.
ты на него не ответил
Цитата Сообщение от Костяныч Посмотреть сообщение
Вы его снова задаете
потому что ты на него не ответил
Цитата Сообщение от Костяныч Посмотреть сообщение
Ну ладно, еще раз отвечу подробно: Да, библиотека на плюсах.
Что да? Причём тут плюсы?
Я тебя спрашиваю ещё раз, ты сам код этой библиотеки писал или нет?

Цитата Сообщение от Костяныч Посмотреть сообщение
Правильный ответ с переводом массива byte в variant описал в последнем посте.
Переводить его можно по разному, всё зависит от того, что с этим вариантом впоследствии делается, по этому я и спрашивал тебя про доступ к коду функции библиотеки.
0
20 / 20 / 4
Регистрация: 31.10.2010
Сообщений: 1,240
Записей в блоге: 2
01.06.2015, 13:25  [ТС] 11
IBM, библиотекой пользуюсь сторонней. Исходник ее есть. Пока скомпилировалось, правильность логики не проверил еще. Как будут проблемы по этой теме, отпишусь.
0
Заблокирован
01.06.2015, 13:28 12
Такое ощущение, что ты хочешь передать в функцию хоть что - то, что бы код собрался
В функцию следует передавать то, что нужно, а для этого следует читать документацию на функцию/ библиотеку или смотреть её исходники.
1
20 / 20 / 4
Регистрация: 31.10.2010
Сообщений: 1,240
Записей в блоге: 2
01.06.2015, 14:13  [ТС] 13
IBM, пока так и хочу сделать, потом залезать в функцию и проверять...

Добавлено через 39 минут
IBM, в общем не сработало...
У меня далее идут операции
C++
1
2
3
4
5
6
const VARIANT* FValue = &Value;
BYTE* FromBuffer = NULL;
long size = 2;
CGXVariant tmp;
VariantCopy(&tmp, FValue);
tmp.GetDataAsBytes(&FromBuffer, &size, GX_VT_NONE);
Value - Это переменная в сигнатуре. Я ее заполняю как указал в посте 7.
0
Заблокирован
01.06.2015, 14:18 14
В общем мне лень гуглить за тебя
Конечно, ты не так массив туда суёшь, там вроде бы в варианте для массива есть parray,
короче гугли по фразе SAFEARRAY to VARIANT или что - то в этом духе...
0
20 / 20 / 4
Регистрация: 31.10.2010
Сообщений: 1,240
Записей в блоге: 2
01.06.2015, 14:19  [ТС] 15
но запустив компилятор и посмотрев значения переменной...там только 0x00, а должно быть 0x00 0x01...
0
654 / 575 / 164
Регистрация: 13.12.2012
Сообщений: 2,124
01.06.2015, 14:31 16
чай в дебаггере посмотрили? лучше распечатайте, а то по указателю только первый элемент дебагер и покажет
0
20 / 20 / 4
Регистрация: 31.10.2010
Сообщений: 1,240
Записей в блоге: 2
01.06.2015, 14:34  [ТС] 17
IBM, нагуглил и использовал следующее:
C++
1
2
3
4
5
6
7
8
9
10
VARIANT To;                 //осуществляет необходимые вызовы функций VariantInit и VariantClear
    To.vt = VT_ARRAY | VT_UI1;
    SAFEARRAYBOUND rgsabound[1];
    rgsabound[0].cElements = 2;
    rgsabound[0].lLbound = 0;
    To.parray = SafeArrayCreate(VT_UI1, 1, rgsabound);
    void * pArrayData = NULL;
    SafeArrayAccessData(To.parray, &pArrayData);
    memcpy(pArrayData, Value, 2);
    SafeArrayUnaccessData(To.parray);
Передаю я переменную To в функцию и смотрю дебагером, что там есть. Там много данных, что именно проверять на предмет наличия моих значений?
А отправлял я 0x00 0x03.
Миниатюры
Работа с byte (Помещение а Variant)  
0
20 / 20 / 4
Регистрация: 31.10.2010
Сообщений: 1,240
Записей в блоге: 2
01.06.2015, 14:34  [ТС] 18
aLarman, что такое чай?
0
Заблокирован
01.06.2015, 14:49 19
Цитата Сообщение от Костяныч Посмотреть сообщение
что именно проверять на предмет наличия моих значений?
Ну судя по твоему коду, ты SAFEARRAY загоняешь в parray, вроде так и надо, значит в parray и смотри. Там вроде указатель на SAFEARRAY, а читать из него так же геморойно, как и писать в него, вот что нагуглил (хотя это должен был делать ты)
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
// get them from somewhere. (I will assume that this is done 
// in a way that you are now responsible to free the memory)
SAFEARRAY* saValues = ... 
LONG* pVals;
HRESULT hr = SafeArrayAccessData(saValues, (void**)&pVals); // direct access to SA memory
if (SUCCEEDED(hr))
{
  long lowerBound, upperBound;  // get array bounds
  SafeArrayGetLBound(saValues, 1 , &lowerBound);
  SafeArrayGetUBound(saValues, 1, &upperBound);
 
  long cnt_elements = upperBound - lowerBound + 1; 
  for (int i = 0; i < cnt_elements; ++i)  // iterate through returned values
  {                              
    LONG lVal = pVals[i];  
    //Костяныч, ВОТ ТУТ СМОТРИ!  Ты получил один элемент массива
    //в виде LONG, теперь ты можешь смело кастить его во что хочешь, допустим в свой байт.
    std::cout << "element " << i << ": value = " << lVal << std::endl;
  }       
  SafeArrayUnaccessData(saValues);
}
SafeArrayDestroy(saValues);
1
654 / 575 / 164
Регистрация: 13.12.2012
Сообщений: 2,124
01.06.2015, 14:51 20
Цитата Сообщение от Костяныч Посмотреть сообщение
aLarman, что такое чай?
== наверное
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
01.06.2015, 14:51
Помогаю со студенческими работами здесь

Работа с полями Variant
Доброй ночи. Такой вопрос. Есть поле в Excel типа Variant, в нем находится изображение. Как выгрузить из Excel данные я знаю. Как...

Работа с типом данных VARIANT
Всем привет. Сейчас работаю с некоторой динамической библиотекой(*.dll). Пытаюсь из этой dll использовать некую функцию GetTitleIDList....

Работа с byte[]
Подскажите пожалуйста литературу о том, как работать с битами в C/C#. Дело в том, что реализовал алгоритм хэширования на C# используя...

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

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


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

Новые блоги и статьи
Простая нейросеть на КуМир: Создание и обучение
EggHead 16.03.2025
Искусственные нейронные сети — удивительная технология, позволяющая компьютерам имитировать работу человеческого мозга. Если вы хотя бы немного интересуетесь современными технологиями, то наверняка. . .
Исполнитель Кузнечик в КуМир: Решение задач
EggHead 16.03.2025
Среди множества исполнителей в системе КуМир особое место занимает Кузнечик — простой, но невероятно полезный виртуальный персонаж, который перемещается по числовой прямой, выполняя ваши команды. На. . .
Исполнитель Водолей в КуМир: Решение задач
EggHead 16.03.2025
Разработка алгоритмического мышления — одна из ключевых задач для начинающих программистов, и система КуМир предлагает отличный способ погрузиться в этот процесс. Среди множества исполнителей в этой. . .
Исполнитель Чертежник в КуМир: Решение задач
EggHead 16.03.2025
Представьте, что вы можете рисовать на бесконечной координатной плоскости, перемещая точку, которая оставляет след. По вашей команде она может поднять перо и двигаться, не оставляя следа, или. . .
Исполнитель Робот в КуМир: Решение задач
EggHead 16.03.2025
КуМир (Комплект Учебных МИРов) — это учебная среда программирования, разработанная специально для обучения базовым концепциям алгоритмизации. Её главная фишка — использование русскоязычного. . .
Исполнитель Черепаха в КуМир: Решение задач
EggHead 16.03.2025
Представьте, что вы впервые учитесь программировать, а перед вами стоит задача заставить маленькую виртуальную черепашку рисовать на экране. Звучит забавно? Эта идея зародилась ещё в 1967 году, когда. . .
Конвейеры данных с Apache Kafka
Javaican 16.03.2025
В мире, где данные стали новой нефтью, Apache Kafka зарекомендовал себя как мощный инструмент для построения надежных и масштабируемых конвейеров данных. Созданный изначально командой LinkedIn в 2011. . .
Deno против Node.js: Будущее JavaScript рантайма
run.dev 16.03.2025
За последнее десятилетие Node. js стал абсолютным лидером среди JavaScript-рантаймов и фактическим стандартом для серверной разработки на JavaScript. Но в 2018 году тот же разработчик, который создал. . .
SwiftUI или UIKit - что выбрать для нового приложения iOS?
mobDevWorks 16.03.2025
Когда Apple представила SwiftUI на WWDC 2019, многим показалось, что дни UIKit сочтены. Новый декларативный фреймворк предлагал радикально иной подход к разработке интерфейсов. Вместо кропотливого. . .
Docker: Руководство для начинающих по созданию первого приложения
Mr. Docker 16.03.2025
Docker — это платформа, которая упаковывает ваше приложение и все его зависимости в стандартизированные блоки, называемые контейнерами. Эти контейнеры изолированы друг от друга и от основной системы,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru