Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
артист
 Аватар для артист
2 / 4 / 3
Регистрация: 17.09.2014
Сообщений: 672
Завершенные тесты: 1
#1

Std::copy как скопировать часть строки массива byte? - C++

03.01.2016, 16:16. Просмотров 347. Ответов 10
Метки нет (Все метки)

Вот из этой строки:
C++
1
BYTE pbHash[40];
Нужно скопировать содержимое с 0й по 15ю ячейку, в эту строку:
C++
1
BYTE bAesKey[16];
Так будет?
C++
1
std::copy(pbHash, pbHash + 16, reinterpret_cast<BYTE *>(bAesKey));
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Somebody
2775 / 1589 / 142
Регистрация: 03.12.2007
Сообщений: 4,162
Завершенные тесты: 1
03.01.2016, 16:33     Std::copy как скопировать часть строки массива byte? #2
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Да. Можно без каста. Ещё можно copy_n.
артист
 Аватар для артист
2 / 4 / 3
Регистрация: 17.09.2014
Сообщений: 672
Завершенные тесты: 1
03.01.2016, 18:04  [ТС]     Std::copy как скопировать часть строки массива byte? #3
Сделал так:

C++
1
2
3
BYTE bAesKey;   // Ключ AES - 16, 24, 32 байт
bAesKey = (BYTE)malloc(16);                 // Выделение памяти на 16 ячеек
std::copy(pbHash, pbHash + 16, bAesKey);    // Сгенерировать пароль из хэша
При компиляции:
Ошибка C2665 std::_Copy_impl: ни одна из 4 перегрузок не может преобразовать все типы аргументов AES Uncript d:\programs\microsoft visual studio 2015\vc\include\xutility 2220
Ошибка C2893 Сбой при специализации функции-шаблона "iterator_traits<_Iter>::iterator_category std::_Iter_cat(const _Iter &)" AES Uncript d:\programs\microsoft visual studio 2015\vc\include\xutility 2220
Ошибка C2672 "std::_Iter_cat": не найдена соответствующая перегруженная функция AES Uncript d:\programs\microsoft visual studio 2015\vc\include\xutility 2220
Предупреждение C4996 'std::_Copy_impl': Function call with parameters that may be unsafe - this call relies on the caller to check that the passed values are correct. To disable this warning, use -D_SCL_SECURE_NO_WARNINGS. See documentation on how to use Visual C++ 'Checked Iterators' AES Uncript d:\programs\microsoft visual studio 2015\vc\include\xutility 2229
Hikari
Хитрая блондиночка $)
 Аватар для Hikari
1444 / 951 / 285
Регистрация: 21.12.2015
Сообщений: 3,798
03.01.2016, 18:10     Std::copy как скопировать часть строки массива byte? #4
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Обязательно именно этой функцией? Она вроде для контейнеров предназначена а не для указателей в принципе?
артист
 Аватар для артист
2 / 4 / 3
Регистрация: 17.09.2014
Сообщений: 672
Завершенные тесты: 1
03.01.2016, 18:30  [ТС]     Std::copy как скопировать часть строки массива byte? #5
Я больше не знаю таких, которые с любыми типами работают.
strncpy - это для строк только...
Хотя byte как и char от 0 до 255...
Может и можно...

Добавлено через 16 минут
Так вылетает:
C++
1
strncpy((char *)bAesKey, (char *)pbHash, 16);
Somebody
2775 / 1589 / 142
Регистрация: 03.12.2007
Сообщений: 4,162
Завершенные тесты: 1
03.01.2016, 20:28     Std::copy как скопировать часть строки массива byte? #6
Сообщение было отмечено автором темы, экспертом или модератором как ответ
C++
bAesKey = (BYTE)malloc(16);
Указатель в BYTE? И вообще на фиг malloc, уж как минимум new.
артист
 Аватар для артист
2 / 4 / 3
Регистрация: 17.09.2014
Сообщений: 672
Завершенные тесты: 1
03.01.2016, 23:25  [ТС]     Std::copy как скопировать часть строки массива byte? #7
Ничего не понял...

Всё по порядку.
Так делаю:
C++
1
2
BYTE bAesKey; // Ключ AES - 16, 24, 32 байт
bAesKey = (BYTE)malloc(16); // Выделение памяти на 16 ячеек
Потому, что проверяю длину ключа в свитче, т.е. мне нужно либо 16, либо 24, либо 32 ячейки.

Зачем здесь BYTE?
C++
1
bAesKey = (BYTE)malloc(16);
Ну потому, что без него тупо не компилируется.

Цитата Сообщение от Somebody Посмотреть сообщение
И вообще на фиг malloc, уж как минимум new.
Зачем мне new, если мне нужен массив BYTE?

Добавлено через 59 минут
Блин, ну как скопировать?

Вылетает при использовании:
C++
1
std::copy(pbHash, pbHash + 16, reinterpret_cast<BYTE *>(bAesKey));
C++
1
strncpy((char *)bAesKey, (char *)pbHash, 16);
Ошибки при компиляции:
C++
1
std::copy(pbHash, pbHash + 16, bAesKey);
Пробовал меньше 16 ставить - то же самое...

Добавлено через 2 минуты
Попробовал при создании ставить 16 ячеек - всё работает...
Это из-за:
C++
1
malloc(16)
Оно не ставит 16 ячеек массиву...

Добавлено через 5 минут
Как же тогда массиву выделять память?

C++
1
2
BYTE bAesKey[1];
bAesKey = (BYTE)malloc(16);
???
ValeryS
Модератор
6451 / 4917 / 451
Регистрация: 14.02.2011
Сообщений: 16,312
03.01.2016, 23:29     Std::copy как скопировать часть строки массива byte? #8
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от артист Посмотреть сообщение
Я больше не знаю таких, которые с любыми типами работают.
старый добрый memcpy
http://cpp.com.ru/shildt_spr_po_c/14/memcpy.html
для твоей задачи
C++
1
memcpy(bAesKey, pbHash,16*sizeof(BYTE));
артист
 Аватар для артист
2 / 4 / 3
Регистрация: 17.09.2014
Сообщений: 672
Завершенные тесты: 1
03.01.2016, 23:31  [ТС]     Std::copy как скопировать часть строки массива byte? #9
Функция calloc выделяет блок памяти для массива размером — num элементов, каждый из которых занимает size байт, и инициализирует все свои биты в нулями.

C++
1
int * arrayPtr = (int*) calloc(size,sizeof(int)); // выделяем память под динамический массив целых чисел
А без звёздочки будет работать?
ValeryS
Модератор
6451 / 4917 / 451
Регистрация: 14.02.2011
Сообщений: 16,312
03.01.2016, 23:32     Std::copy как скопировать часть строки массива byte? #10
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от артист Посмотреть сообщение
Как же тогда массиву выделять память?
тебе же сказали
Цитата Сообщение от Somebody Посмотреть сообщение
уж как минимум new.
C++
1
2
BYTE* bAesKey; // Ключ AES - 16, 24, 32 байт
bAesKey = new BYTE[16];
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.01.2016, 23:38     Std::copy как скопировать часть строки массива byte?
Еще ссылки по теме:

Ошибка в std::copy не ясна C++
C++ Как скопировать часть массива WCHAR в массив BYTE?
Скопировать часть строки и часть удалить C++
Как представить byte в виде строки? C++
Скопировать с конца строки std::string четыре символа в другую строку C++

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

Или воспользуйтесь поиском по форуму:
артист
 Аватар для артист
2 / 4 / 3
Регистрация: 17.09.2014
Сообщений: 672
Завершенные тесты: 1
03.01.2016, 23:38  [ТС]     Std::copy как скопировать часть строки массива byte? #11
П.с. не увидел, спасибо.

Добавлено через 5 минут
Всё работает )) Ыыы
Yandex
Объявления
03.01.2016, 23:38     Std::copy как скопировать часть строки массива byte?
Ответ Создать тему
Опции темы

Текущее время: 06:12. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru