Задать вопрос
@kytcenochka

Записать значения дискретных каналов в бинарный файл. С++?

Есть массив из значений дискретных каналов.

int discretCh = 6; // всего 6 дискретных каналов

Значения всегда будут либо 0 либо 1. Могут вообще быть только 0000000 либо 111111

int ChValue [6] = {000011}

в книге описано, как нужно записывать эти значения в бинарный файл. Пример:

For a set of six status inputs (000011)

a) Write these status inputs as a binary number (110000).

b) Then pad the number out to a 16 bit number (0000 0000 0011 0000).

c) Translate this to a hexadecimal value (00 30).

d) The data is then stored in LSB/MSB format (30 00).

Важно, что от количества каналов зависит размер переменной, в которую записывается значение (30 00)

Нужно проверить

sizеVar = discretCh/16 округление в большую степень

if (sizеVar <= 1) 2 байта для хранения

if (sizеVar > 1 || sizеVar = 2 ) добавляем еще 2 байта

if (sizеVar > 2 || sizеVar = 3 ) добавляем еще 2 байта

Все это я записываю в файл, строка должна получиться вида:

05 00 00 00 9B 02 00 00 08 FD FA 04 48 00 3D 00 74 FF 0A FE 30 00

именно в последних 2х байтах должны храниться дискретные значения.

Понимаю, что нужно записать последовательность значений (000011) в целое число, пробовала, но нули отбрасываются(
Подскажите, пожалуйста! Как реализовать это? Примеров очень мало
  • Вопрос задан
  • 148 просмотров
Подписаться 1 Средний Комментировать
Решения вопроса 1
@res2001
Developer, ex-admin
Инициализируя вот так массив:
int ChValue [6] = {000011};
Вы получите в ChValue[0] = 9 - десятичное 9 - это восьмеричное 011. По правилам языка, целочисленные числовые константы, начинающиеся с 0 являются восьмеричными. В остальных элементах массива будут 0.
Вы хотите записать шесть значений в одну двухбайтовую переменную (хотя было бы достаточно и 1 байта).
Для этого вам нужно использовать битовые операции.
Например:
// ChValue - исходный массив значений по каждому каналу
int ChValue [6] = {0, 0, 0, 0, 1, 1};
uint16_t val = 0;
for(int i = 0; i < 6; ++i)
{
  if(ChValue[i] == 1)
     val |= 1 << i;
}
// в результате в val будет установлен в 1 бит с номером канала в котором в ChValue единица.

После этого просто запишите val в файл.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы