Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.78/40: Рейтинг темы: голосов - 40, средняя оценка - 4.78
1 / 1 / 1
Регистрация: 13.03.2012
Сообщений: 424
1

Запись байтов в массив char

22.05.2017, 16:47. Показов 7880. Ответов 23
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Есть переменная типа
C++
1
char ch[7]
как можно записать туда числа в таком порядке в какой я хочу, у меня есть задача запихать в первые 2 байта число от 0 до 360
в 3 байт число от 1-10 в 4-5 байт число от 0 до 360 в 6-7 байт число от 0 до 360.
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
22.05.2017, 16:47
Ответы с готовыми решениями:

Запись аудиофайла в массив байтов
привет!) подскажите пожалуйста, как записать аудио файл в массив байтов??? заранее спасибо

Запись звука в массив байтов
Если в кратце, то... то мне нужно получить байты с микрофона и записать из в массив/байтов. Я уже...

Запись строки char в массив char
Глупый вопрос, но что поделать, многое забыл... Хочу записть строку типа char в массив строк типа...

Запись символов в массив char
Не могу понять как сделать чтобы каждая буква массива введеная мною считалась как один элемент...

23
зомбяк
1584 / 1218 / 345
Регистрация: 14.05.2017
Сообщений: 3,939
22.05.2017, 21:19 21
Author24 — интернет-сервис помощи студентам
MasterOfAlteran, возможно. Но как уже сказал, с тем, что reinterpret_cast работала некорректно под VS2010 при реинтерпритации данных, уже сталкивался, а с некорректной работой union'а ещё нет. Тем более что если есть memcpy, то то же самое проделывается и вручную и кстати тоже неоднозначно (из-за порядка байтов)... Но там уже совсем не присваивания идут.
0
52 / 30 / 13
Регистрация: 21.05.2017
Сообщений: 109
22.05.2017, 21:49 22
Цитата Сообщение от palva Посмотреть сообщение
Тогда не очень понятно, зачем в C++ оставлен union. union как раз и применяется для того, чтобы одни и те же данные записывать одним типом, а читать другим
По ссылке выше написано зачем:
Цитата Сообщение от HelicopterK52 Посмотреть сообщение
Целью объединения является сохранение памяти, использую одну область памяти для хранения объектов в разное время. Вот и всё.
Теперь у нас еще имеется библиотечный std::variant, который для подобных целей подходит еще лучше, чем сырое объединение.
А проблемы с интерпретацией могут возникнуть уже при простой передаче двух указателей/ссылок в функцию:
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
//g++  5.4.0
 
#include <iostream>
 
 
union Some
{
    static_assert(sizeof(uint64_t) == sizeof(double), "sizes must be equals");
    uint64_t one;
    double two;
};
 
 
 
void foo(uint64_t &i, double &d)
{
    d = 30.0;
    i = 10u;
    std::cout << "foo: " << d << std::endl;
}
 
 
int main()
{
    Some s;
    s.two = 20.0;
    
    foo(s.one, s.two);
    std::cout << "foo: " << s.two << std::endl;
}
http://rextester.com/BUA66093
Виноват в этом не совсем union (хотя...), но допустить такую ситуацию в проекте с активным его использованием вполне возможно.

Добавлено через 12 минут
Цитата Сообщение от TRam_ Посмотреть сообщение
а с некорректной работой union'а ещё нет
В коде выше для CL достаточно поменять сигнатуру функции на void foo(uint64_t & i, double & __restrict d) и добавить опцию /O1 для получения "прелестей жизни": http://rextester.com/LNEI87224
0
зомбяк
1584 / 1218 / 345
Регистрация: 14.05.2017
Сообщений: 3,939
22.05.2017, 22:55 23
Собственно если заменить ту конструкцию на такую:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream>
 
void foo(uint64_t &i, double &d)
{
    d = 30.0;
    i = 10u;
    std::cout << "foo: " << d << std::endl;
}
 
int main()
{
    double d;
    uint64_t *i = reinterpret_cast<uint64_t *>(&d);
     
    d = 20.0;
    
    foo(*i, d);
    std::cout << "foo: " << d << std::endl;
}
поведение будет в точности аналогично варианту с union Some. (что при /O3 оператор i = 10u; выполняется уже после std::cout)

Добавлено через 6 минут
Но вообще мне эта функция по смыслу напоминает функцию
C++
1
2
3
4
5
void foo(uint64_t &i, double &d)
{
    i = d;    
    std::cout << "foo: " << d << std::endl;
}
результат которой и по смыслу-то не определён (присвоение самому себе внутри себя), и в каком-то смысле похож на memcpy перекрывающихся областей.
0
зомбяк
1584 / 1218 / 345
Регистрация: 14.05.2017
Сообщений: 3,939
26.05.2017, 19:40 24
В общем, нашёл про это подробную и доходчивую статью - https://habrahabr.ru/post/114117/
1
26.05.2017, 19:40
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
26.05.2017, 19:40
Помогаю со студенческими работами здесь

Запись числа в массив char
Нужно записать int число в виде char. То есть число записать по битам в массив. Как сделать ?

Char[], Запись из файла в массив
Есть проблема. Есть файл в котором хранятся двоичные числа. Нужно из файла записать строки этих...

Считывание из текстбоксов байтов и запись в массив
Добрый день. Возникла проблема Возникла потребность вводить в текстбоксы много значений и...

Сериализация изображения в массив байтов и запись в *.pas
Добрый день! Хотелось бы сериализовать изображения, которые будут использоваться в компоненте в...

Выполнить чтение всех байтов с файла с помощью FileInputStream в массив байтов
Выполнить чтение всех байтов с файла с помощью FileInputStream в массив байтов. Создать строку...

Чтение из файла и запись в массив char
Здравствуйте форумчане. Столкнулся с незнанием языка. У меня есть поток, который читает файл. Как...


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

Или воспользуйтесь поиском по форуму:
24
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru