Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
артист
94 / 20 / 20
Регистрация: 17.09.2014
Сообщений: 1,185
Завершенные тесты: 2
#1

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

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

Вот из этой строки:
C++
1
BYTE pbHash[40];
Нужно скопировать содержимое с 0й по 15ю ячейку, в эту строку:
C++
1
BYTE bAesKey[16];
Так будет?
C++
1
std::copy(pbHash, pbHash + 16, reinterpret_cast<BYTE *>(bAesKey));
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.01.2016, 16:16
Ответы с готовыми решениями:

Как скопировать часть массива WCHAR в массив BYTE?
Пытаюсь зашифровать строку в AES. wTextIn - исходный текст wTextOut -...

Как скопировать часть строки до определенного символа?
Допустим, пользователь вводит с клавиатуры строку. Необходимо скопировать часть...

Std::begin() ,std::end(),std::copy
...// int main() { std::vector&lt;double&gt; data;//Работает cout &lt;&lt;...

Стандартный поток и STL (std::copy to std::cout)
#include &lt;iostream&gt; #include &lt;sstream&gt; #include &lt;algorithm&gt; #include...

Скопировать часть строки и часть удалить
1. Удалить из строки ее часть с заданной позиции и заданной длины. 2....

10
Somebody
2799 / 1610 / 251
Регистрация: 03.12.2007
Сообщений: 4,212
Завершенные тесты: 3
03.01.2016, 16:33 #2
Лучший ответ Сообщение было отмечено артист как решение

Решение

Да. Можно без каста. Ещё можно copy_n.
1
артист
94 / 20 / 20
Регистрация: 17.09.2014
Сообщений: 1,185
Завершенные тесты: 2
03.01.2016, 18:04  [ТС] #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
0
Hikari
Хитрая блондиночка $)
1451 / 960 / 399
Регистрация: 21.12.2015
Сообщений: 3,785
03.01.2016, 18:10 #4
Лучший ответ Сообщение было отмечено артист как решение

Решение

Обязательно именно этой функцией? Она вроде для контейнеров предназначена а не для указателей в принципе?
1
артист
94 / 20 / 20
Регистрация: 17.09.2014
Сообщений: 1,185
Завершенные тесты: 2
03.01.2016, 18:30  [ТС] #5
Я больше не знаю таких, которые с любыми типами работают.
strncpy - это для строк только...
Хотя byte как и char от 0 до 255...
Может и можно...

Добавлено через 16 минут
Так вылетает:
C++
1
strncpy((char *)bAesKey, (char *)pbHash, 16);
0
Somebody
2799 / 1610 / 251
Регистрация: 03.12.2007
Сообщений: 4,212
Завершенные тесты: 3
03.01.2016, 20:28 #6
Лучший ответ Сообщение было отмечено артист как решение

Решение

C++
bAesKey = (BYTE)malloc(16);
Указатель в BYTE? И вообще на фиг malloc, уж как минимум new.
1
артист
94 / 20 / 20
Регистрация: 17.09.2014
Сообщений: 1,185
Завершенные тесты: 2
03.01.2016, 23:25  [ТС] #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);
???
0
ValeryS
Модератор
7170 / 5437 / 674
Регистрация: 14.02.2011
Сообщений: 18,372
03.01.2016, 23:29 #8
Лучший ответ Сообщение было отмечено артист как решение

Решение

Цитата Сообщение от артист Посмотреть сообщение
Я больше не знаю таких, которые с любыми типами работают.
старый добрый memcpy
http://cpp.com.ru/shildt_spr_po_c/14/memcpy.html
для твоей задачи
C++
1
memcpy(bAesKey, pbHash,16*sizeof(BYTE));
1
артист
94 / 20 / 20
Регистрация: 17.09.2014
Сообщений: 1,185
Завершенные тесты: 2
03.01.2016, 23:31  [ТС] #9
Функция calloc выделяет блок памяти для массива размером — num элементов, каждый из которых занимает size байт, и инициализирует все свои биты в нулями.

C++
1
int * arrayPtr = (int*) calloc(size,sizeof(int)); // выделяем память под динамический массив целых чисел
А без звёздочки будет работать?
0
ValeryS
Модератор
7170 / 5437 / 674
Регистрация: 14.02.2011
Сообщений: 18,372
03.01.2016, 23:32 #10
Лучший ответ Сообщение было отмечено артист как решение

Решение

Цитата Сообщение от артист Посмотреть сообщение
Как же тогда массиву выделять память?
тебе же сказали
Цитата Сообщение от Somebody Посмотреть сообщение
уж как минимум new.
C++
1
2
BYTE* bAesKey; // Ключ AES - 16, 24, 32 байт
bAesKey = new BYTE[16];
1
артист
94 / 20 / 20
Регистрация: 17.09.2014
Сообщений: 1,185
Завершенные тесты: 2
03.01.2016, 23:38  [ТС] #11
П.с. не увидел, спасибо.

Добавлено через 5 минут
Всё работает )) Ыыы
0
03.01.2016, 23:38
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.01.2016, 23:38

Не получается использовать std::copy как memcpy?
Получил задание переписать свою код: Поля x, y указывают координаты, куда...

BYTE to std::string как есть
Чё то я забыл (ну я же нуб :D ), как перевести массив байтов, записанный в...

Скопировать часть строки
Здравствуйте. Имеется 2 строки AnsiString str1 = &quot;123456&quot;; AnsiString...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru