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

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

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

Студворк — интернет-сервис помощи студентам
Есть переменная типа
C++
1
char ch[7]
как можно записать туда числа в таком порядке в какой я хочу, у меня есть задача запихать в первые 2 байта число от 0 до 360
в 3 байт число от 1-10 в 4-5 байт число от 0 до 360 в 6-7 байт число от 0 до 360.
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
22.05.2017, 16:47
Ответы с готовыми решениями:

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

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

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

23
с++
1282 / 523 / 225
Регистрация: 15.07.2015
Сообщений: 2,562
22.05.2017, 16:52
Цитата Сообщение от Семан Посмотреть сообщение
char ch[7]
Это же символьный тип а вы число запихиваете
0
4949 / 2289 / 287
Регистрация: 01.03.2013
Сообщений: 5,991
Записей в блоге: 32
22.05.2017, 16:55
1. Можешь получать указатели на i-е элементы твоего байтового массива, перекастивать их к указателям на инты и писать инты по ним. Если верить, что в чаре всегда 1 байт, что в инте у тебя окажется 2 байта, то сработает - массив гарантирует последовательное расположение в памяти.

2. Можешь выделять хай/лоу байты твоих интов и писать их сразу в нужные элементы массива. Единственно что - надо будет узнать, литл или биг эндиан система у тебя, и учитывать порядок байт. Или сделать какую-нибудь проверку и по ее результатам писать в нужном порядке.

Добавлено через 1 минуту
Цитата Сообщение от Antikl Посмотреть сообщение
Это же символьный тип а вы число запихиваете
Формально вы правы, и так делать не надо. Надо сразу создавать массив байт а не чаров. Но в С++ это будет прокатывать везде, где чары не экзотические - а это большинство платформ.

Добавлено через 1 минуту
ЗЫ а еще, говорят, можно накостылить структуру с полями нужных типов, и писать туда, горя не зная. Если сделать ее поля упакованными, то потом ее точно так же можно будет читать как последовательный массив байт.
0
 Аватар для moskitos80
442 / 99 / 42
Регистрация: 04.10.2011
Сообщений: 359
22.05.2017, 17:41
Цитата Сообщение от Семан Посмотреть сообщение
запихать в первые 2 байта число от 0 до 360
число более 255 не поместится в 2 байта
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
22.05.2017, 18:23
Цитата Сообщение от moskitos80 Посмотреть сообщение
число более 255 не поместится в 2 байта
В 2 поместится.
C++
1
*reinterpret_cast<uint16_t *>(ch) = 300;
1
 Аватар для dailydose
671 / 217 / 88
Регистрация: 21.07.2016
Сообщений: 1,036
Записей в блоге: 2
22.05.2017, 18:29
Цитата Сообщение от nmcf Посмотреть сообщение
В 2 поместится.
C++
1
*reinterpret_cast<uint16_t *>(ch) = 300;

Не по теме:

неужто нашел применение non_static_cast'у<>


а как его потом достать оттуда ?
0
4949 / 2289 / 287
Регистрация: 01.03.2013
Сообщений: 5,991
Записей в блоге: 32
22.05.2017, 18:36
Цитата Сообщение от moskitos80 Посмотреть сообщение
число более 255 не поместится в 2 байта
фигасе, чего только не узнаешь на форуме!
Цитата Сообщение от dailydose Посмотреть сообщение
а как его потом достать оттуда ?
Специальным велосипедным побайтовым доставателем или просто указанием компилятору прочитать инт по данному указателю.
0
 Аватар для dailydose
671 / 217 / 88
Регистрация: 21.07.2016
Сообщений: 1,036
Записей в блоге: 2
22.05.2017, 18:42
Цитата Сообщение от _Ivana Посмотреть сообщение
фигасе, чего только не узнаешь на форуме!
ага
Цитата Сообщение от _Ivana Посмотреть сообщение
число более 255 не поместится в 2 байта
Type Name Bytes Other Names Range of Values
char 1 none –128 to 127 by default

0 to 255 when compiled by using /J
https://msdn.microsoft.com/en-... 49ktz.aspx
0
4949 / 2289 / 287
Регистрация: 01.03.2013
Сообщений: 5,991
Записей в блоге: 32
22.05.2017, 18:47
Не, ну когда жаваскриптеры и прочие высокоуровневые господа не знают байты и память, то это еще объяснимо. Но когда плюсовики (или им сочувствующие) - это уже веселее
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
22.05.2017, 18:57
Цитата Сообщение от dailydose Посмотреть сообщение
а как его потом достать оттуда ?
Этой же конструкцией.
1
 Аватар для dailydose
671 / 217 / 88
Регистрация: 21.07.2016
Сообщений: 1,036
Записей в блоге: 2
22.05.2017, 19:35
Цитата Сообщение от _Ivana Посмотреть сообщение
когда жаваскриптеры и прочие высокоуровневые господа не знают байты и память
для меню ++плюсы это не более чем хобби
0
зомбяк
 Аватар для TRam_
1585 / 1219 / 345
Регистрация: 14.05.2017
Сообщений: 3,940
22.05.2017, 19:38
Лучший ответ Сообщение было отмечено Семан как решение

Решение

Но иногда компиляторы с включенной оптимизацией начитают это место глотать, получается хз что. Лучше так

C
1
2
3
4
5
6
7
8
9
10
11
union converter_ch7
{
    char ch[7];
 
    struct
    {
        short degree0;
        char little_data;
        short degree1;
    };
};
Юзать так:
C
1
2
3
4
5
6
7
    converter_ch7 conv;
    conv.degree0 = 56;
    conv.little_data = 6;
    conv.degree1 = 12;
 
    char ch[7];
    memcpy(ch, conv.ch, sizeof(converter_ch7));
1
 Аватар для moskitos80
442 / 99 / 42
Регистрация: 04.10.2011
Сообщений: 359
22.05.2017, 19:53
Цитата Сообщение от _Ivana Посмотреть сообщение
фигасе, чего только не узнаешь на форуме!
Дичайше извиняюсь! Бес попутал. Конечно 2^16 = 65536 перегрелся я наверное
0
 Аватар для palva
4278 / 2970 / 693
Регистрация: 08.06.2007
Сообщений: 9,930
Записей в блоге: 5
22.05.2017, 20:29
TRam_, во-первых надо прагму выставлять, чтобы предотвратить выравнивание элементов структуры, во-вторых обращаться к элементам структуры нужно все-таки трехэтажно, а в-третьих можно использовать unsigned, чтобы использовать знаковый бит в качестве числового. Правда, мы не знаем, будут ли у ТС отрицательные числа. Можно, например, так:
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
#include <iostream>
using namespace std;
 
#pragma pack(push,1)
union converter_ch7
{
    unsigned char ch[7];
    struct
    {
        short degree0;
        unsigned char little_data;
        short degree1;
    } s;
};
#pragma pack(pop)
 
int main() {
    cout << sizeof(converter_ch7) << endl; // 7
    converter_ch7 conv;
    conv.s.degree0 = 300;
    conv.s.little_data = 200;
    conv.s.degree1 = 301;
    cout << conv.s.degree0 << ' ' << (int)conv.s.little_data << ' ' << (int)conv.ch[2] << endl;
    return 0;
}
1
53 / 31 / 13
Регистрация: 21.05.2017
Сообщений: 109
22.05.2017, 20:40
palva, нужно заметить, что запись в одно "поле" union и чтение из другого приводит к неопределенному поведению.
0
зомбяк
 Аватар для TRam_
1585 / 1219 / 345
Регистрация: 14.05.2017
Сообщений: 3,940
22.05.2017, 20:43
Да... Что ещё я пропустил, тут у нас должно быть так
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#pragma pack(push,1)
union converter_ch7
{
    unsigned char ch[7];
    struct
    {
        short degree0;
        char little_data;
        short degree1;
        short degree2;
    } s;
};
#pragma pack(pop)
Отрицательных нет, т.к.
в 3 байт число от 1-10
а в остальные от 0 до 360. Так что тут знаковость/беззнаковость не повлияет.

Добавлено через 1 минуту
Цитата Сообщение от MasterOfAlteran Посмотреть сообщение
нужно заметить, что запись в одно "поле" union и чтение из другого приводит к неопределенному поведению.
к вполне определённому. union - наложенные друг на друга типы, так что если знаешь как расположены байты в каждом из типов, однозначно понятно, какой байт откуда куда перейдёт.
0
53 / 31 / 13
Регистрация: 21.05.2017
Сообщений: 109
22.05.2017, 20:46
TRam_, такое поведение разрешено в C, но для C++ - это приведет к неопределенному поведению. Советую почитать соответствующую документацию.
0
зомбяк
 Аватар для TRam_
1585 / 1219 / 345
Регистрация: 14.05.2017
Сообщений: 3,940
22.05.2017, 20:50
MasterOfAlteran, из MSDN
Неограниченные объединения (C++11)
В C++03 и более ранних версиях нестатические элементы данных с типом класса могут входить в объединения, лишь если для типов отсутствуют пользовательские конструкторы, деструкторы или операторы присваивания. В C++11 эти ограничения отсутствуют. Если включить такой член в объединение, компилятор автоматически пометит все специальные функции-члены, не предоставленные пользователем, как удаленные. Если в класс или структуру входит анонимное объединение, все специальные функции-члены этого класса или структуры, не предоставленные пользователем, помечаются как удаленные. В следующем примере демонстрируется ситуация, когда один из членов объединения содержит член, требующий специальной обработки:
Естественно в случае произвольного класса с виртуальными функциями и шаблонами поведение не будет определено, но не для данного случая.
0
53 / 31 / 13
Регистрация: 21.05.2017
Сообщений: 109
22.05.2017, 21:08
TRam_, причем здесь это? Почитайте стандарт языка, там всё написано.

Добавлено через 16 минут
О! Даже на этом форуме нашлась тема: Приведение указателя базового типа
0
 Аватар для palva
4278 / 2970 / 693
Регистрация: 08.06.2007
Сообщений: 9,930
Записей в блоге: 5
22.05.2017, 21:18
MasterOfAlteran, Тогда не очень понятно, зачем в C++ оставлен union. union как раз и применяется для того, чтобы одни и те же данные записывать одним типом, а читать другим. Другое дело, что в разных архитектурах такие программы могут работать по-разному. Компилятор C++ не может это контролировать. В этом смысле даже на C такой код приведет к неопределенному поведению.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
22.05.2017, 21:18
Помогаю со студенческими работами здесь

Запись символов в массив char
Не могу понять как сделать чтобы каждая буква массива введеная мною считалась как один элемент массива.(я тупой) Например: Ввод: guns ...

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Автозаполнение реквизита при выборе элемента справочника
Maks 27.03.2026
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. При выборе "Спецтехники" (Тип Справочник. Спецтехника), заполняется. . .
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут. https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc Первый документ красиво выглядит, но без схемы. Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
Автозаполнение реквизитов при создании документа
Maks 26.03.2026
Программный код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере". Алгоритм проверки заполнения реализован для исключения перезаписи значения реквизита,. . .
Команды формы и диалоговое окно
Maks 26.03.2026
1. Команда формы "ЗаполнитьЗапчасти". Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. В качестве источника данных. . .
Кому нужен AOT?
DevAlt 26.03.2026
Решил сделать простой ланчер Написал заготовку: dotnet new console --aot -o UrlHandler var items = args. Split(":"); var tag = items; var id = items; var executable = args;. . .
Отправка уведомления на почту при создании или изменении элементов справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной записи электронной. . .
модель ЗдравоСохранения 5. Меньше увольнений- больше дохода!
anaschu 24.03.2026
Теперь система здравосохранения уменьшает количество увольнений. 9TO2GP2bpX4 a42b81fb172ffc12ca589c7898261ccb/ https:/ / rutube. ru/ video/ a42b81fb172ffc12ca589c7898261ccb/ Слева синяя линия -. . .
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. . Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru