C/C++

Копирование бит из массива в массив не используя memcpy. (Си)

Надо скопировать из char массива в wchar_t массив. Поэтому даже специальная функция для wchar_t wmemcpy не будет работать.
Надо попробовать побитовые операции использовать.
Но я я знаю как побитовыми операциями копировать биты. Как в ноль установить знаю, как инвертировать или в единицу установить, но не как копировать.
могу ошибаться, но memcpy глубоко фиолетово, что во что копировать. единственная проблема с ней - указать правильное количество байтов.
или требуется не просто побайтное копирование, а преобразование типов?
Nodir Nomozov
Nodir Nomozov
79 707
Лучший ответ
Рафкат Нигматуллин char==1 Байт
wchar_t==2 Байта

Мне надо в wchar_t 2 Байта массива char положить по порядку
Рафкат Нигматуллин Во первых memcpy не копирует из разных типов массивов. Из char в wchar_t
Во вторых memcpy может скопировать только из одного типа в другой, не побитово, а полностью из одного в другой. Если это возможно

У меня есть два Байта.
0001 0000
0011 0000
Их надо сохранить в переменную wchar_t по порядку
Рафкат Нигматуллин Это ведь один байт char сохранится в двух Байтах wchar_t?
Мне надо 2 байта char сохранить в двух Байтах wchar_t
Рафкат Нигматуллин memcpy у меня не копирует в разные типы. Из char в wchar_t

Вот например так
int main()
{
char charvariable1='a';
char charvariable2='b';
wchar_t wcharvariable = 0;
mbstowcs(&wcharvariable, &charvariable1,8);
mbstowcs(&wcharvariable, &charvariable2,8);
printf("%c\n", wcharvariable);
}
В переменную wcharvariable ПЕРЕЗАПИШЕТСЯ char charvariable2='b';
В переменной wcharvariable будет не 2 переменных по порядку, а перезапишется последняя переменная.

Может есть другой способ
Рафкат Нигматуллин int main()
{
char charvariable1='a';
char charvariable2='b';
wchar_t wcharvariable = 0;
mbstowcs(&wcharvariable, &charvariable1,8);
mbstowcs(&wcharvariable, &charvariable2,8);
printf("%c\n", wcharvariable);
for(int i=15;i>=0;i--)
{
if(wcharvariable&1<<i)
{
printf("%d", 1);
}
else{printf("%d", 0);}
}
printf("\n");
}
Рафкат Нигматуллин Перезаписывается
Рафкат Нигматуллин wcharvariable в вашем примере это массив. И вы вывели элементы массива
Рафкат Нигматуллин aaaaaaaabbbbbbbbb Это элементы массива
Рафкат Нигматуллин Проще говорить о простых переменных тогда.
У меня есть два Байта.
0001 0000
0011 0000
Их надо сохранить в ОДНУ переменную wchar_t по порядку
Рафкат Нигматуллин https://onlinegdb.com/xxUQabcCN
Но этот код надо ещё переделывать потому что я не учёл что между кириллицей могут быть латинские символы.
Онлайн компилятор кириллицу латиницей печатает если что.
Nodir Nomozov ^_^ ну как бы, не вопрос:
https://rextester.com/WVPEH45723
Рафкат Нигматуллин Хмм, не знал что mbstowcs так может.
Да, это то что надо.
Рафкат Нигматуллин >>и, кстати, onlinegdb отлично понимает русские (и все остальные) буквы:
Видимо только не в языке Си?
https://onlinegdb.com/IMUytqQE5
Рафкат Нигматуллин Да, точно есть. В заголовочных файлах #include < locale.h > и #include < wchar.h >
Рафкат Нигматуллин У меня выводилась кириллица, потому что поставил в IDE кодировку 1251.
При utf8 кодировке кракозябры только.
Побитово трансформировать надёженее будет.
Рафкат Нигматуллин Когда ставлю utf8 в IDE, то функция mbstowcs сохраняет ДВА char элемента массива, в ДВА wchar_t элемента массива.
Когда кодировка 1251 в в IDE, то функция mbstowcs сохраняет ДВА char элемента массива, в ОДИН wchar_t элемент массива.
Рафкат Нигматуллин Это где писать надо? finput-charset=cp1251
У меня такая дичь только в настройки Code Blocks вставляется.
А в других компиляторах куда?
Nodir Nomozov ну, тут не подсажу, у меня Code Blocks нет
вот тут:
https://stackoverflow.com/questions/33208733/how-to-add-compiler-flags-on-codeblocks
говорят, где-то в Project > Build Options > Compiler Flags
Рафкат Нигматуллин В Code Blocks я как раз знаю где вставлять. Это меняет кодировку
Не понимаю чем это поможет.
Я кодировку сменил уже
Рафкат Нигматуллин Собственно да, ничего не меняет
Если у вас A[] char массива в B[] wchar_t массив
wchar_t C[255] - заведите себе массив такой и занесите все символы в нужной кодировке.
Потом B[i] = C[ A[i] ] в цикле для каждого i-того и сделаете
Игорь Х_Х
Игорь Х_Х
74 714
Рафкат Нигматуллин char==1 Байт
wchar_t==2 Байта

Мне надо в wchar_t 2 Байта массива char положить по порядку
Рафкат Нигматуллин Я с кодированием и перекодированием уже разобрался. Мне надо просто теперь результат работы положить в массив wchar_t
Рафкат Нигматуллин У меня есть два Байта.
0001 0000
0011 0000
Их надо сохранить в переменную wchar_t
Рафкат Нигматуллин Я точно разобрался.
Максик ... > Я с кодированием и перекодированием уже разобрался. Мне надо просто теперь результат работы положить в массив wchar_t

Нихрена вы не разобрались, судя по этому комментарию
Рафкат Нигматуллин Если получится сохранить, скину код
Рафкат Нигматуллин По вашему комментарию и правда сказать нечего.
Рафкат Нигматуллин https://onlinegdb.com/xxUQabcCN
Но этот код надо ещё переделывать потому что я не учёл что между кириллицей могут быть латинские символы.
Онлайн компилятор кириллицу латиницей печатает если что.
Рафкат Нигматуллин >>правильно. Зачем лепить горбатого? Просто из одного массива посимвольно переносишь в другой
Зачем так если можно мапример кучу места с экономить?
Рафкат Нигматуллин Хотя не экономится место ведь))
Но можте пригодится)
Скопировать можно через memcpy. Никаких волшебных данных, с которыми бы она не справилась, не существует, но после копирования результат в строку из длинных символов, естественно, не превратится.

По сути вопроса - требуется не копирование, а преобразование строки, для этого, естественно, есть специальные функции типа mbstowcs или более низкоуровневые RtlAnsiStringToUnicodeString
Кирилл Салов
Кирилл Салов
30 155
Это разные типы данных.
Нельзя копированием байт данных превратить один тип данных в другой.
Обычно для этого используют специальные программы (конструкторы и операторы).
эти программы и совершают все необходимые операции с данными.
например простое выражение в c++ " a = b " означает что у переменной a нужно определить ее тип у этого типа нужно найти программу оператора присваивания и вызвать эту программу с параметром b.

memcpy просто копирует данные в памяти не вызывая никаких специальных программ работающих с данными.
Павел Старухин
Павел Старухин
12 593
Рафкат Нигматуллин Я тип данных менять не собираюсь. мне просто биты скопировать
Павел Старухин memcpy с этим замечательно справиться.
но нужно понимать что биты из типа данных char прочитанные как тип данных wchar_t будут бессмысленным мусором.
Рафкат Нигматуллин memcpy копирует ВО ВСЁ ПРОСТРАНСТВО типа wchar_t
У меня есть два Байта.
0001 0000
0011 0000
Их надо сохранить в переменную wchar_t
Рафкат Нигматуллин Переменная типа wchar_t имеет размер 2 Байта. Ничего я никуда ещё не копировал.
Мне в эти 2 Байта надо сохранить 2 переменные типа char
ПОЛУЧЕННЫЙ РЕЗУЛЬТАТ ЭТО УЖЕ МОЯ ГОЛОВНАЯ БОЛЬ.
Рафкат Нигматуллин Если честно, то вы пишете абсолютный БРЕД
Рафкат Нигматуллин Поспите что ли
Рафкат Нигматуллин Блят* это сюрреализм какой то, цирк
Ну типа такого что ли можно было бы
if(charmassiv[i]&1<<7)
{
wcharmassiw[i]&1<<7;
}
Павел Старухин >> Переменная типа wchar_t имеет размер 2 Байта ...
Откуда такая уверенность? если работаешь в студии выделяешь объявление wchar_t открываешь контекстное меню и ищешь декларацию этого типа там будет что то типа #define char16_t wchar_t затем ищешь реализацию реального типа.
Рафкат Нигматуллин Не определяемый, а определенный реализацией.
В компиляторе Microsoft он представляет собой 16-битный символ, используемый для хранения Unicode, закодированного как UTF-16LE,
Рафкат Нигматуллин >> Это к святой уверености в 2 Байта у wchar_t
А это на тему того как я разобрался в кодировках

https://onlinegdb.com/xxUQabcCN
Но этот код надо ещё переделывать потому что я не учёл что между кириллицей могут быть латинские символы.
Онлайн компилятор кириллицу латиницей печатает если что.
Рафкат Нигматуллин **И решение заданного здесь вопроса, на который хз выделывались все как могли.
Да здорово, вооружиться всеми достоинствами сишного языка и дома посидеть перебирая биты) wchar_t не особо востребованный тип, так как энглишь и русишь влезают в тип char)
Александр Ершев Все, понял почему мой ответ не лидер! Копируй побайтово, в цикле с условием что x%1 не верно)