Хранение данных на устройстве

108
9

У меня мало опыта с операциями/хранением двоичных данных, поэтому я был бы очень признателен, если бы кто-то мог прояснить некоторые вещи для меня.

У меня есть устройство, где вы должны хранить 16 байт. например, вы должны послать ему массив байтов, вероятно, с информацией заголовка. например, smth:

unsigned char sendBuffer[255];
sendBuffer[0] = headerInfo1;
sendBuffer[1] = headerInfo1;
sendBuffer[2] = headerInfo1;
sendBuffer[3] = headerInfo1;
sendBuffer[4] = data;
sendBuffer[5] = data;
sendBuffer[6] = data;
sendBuffer[7] = data;
sendBuffer[8] = data;
...
sendBuffer[20] = data;

Пусть говорят, что отправить операцию легко, просто используйте Send(sendBuffer, length).

Мой вопрос заключается в том, что я хочу сохранить целое число в устройстве - что лучший способ сделать это?

У меня есть пример кода, который делает это, и я не был уверен, что все в порядке и как это делается. Это тоже смутило меня. Я в основном ввожу номер, который я хочу сохранить в текстовом поле. Скажем, я хочу сохранить 105 в десятичной системе. Я ввожу "00000000000000000000000000000105" (я не уверен, как программа интерпретирует это еще, как десятичную или шестую), тогда есть этот код:

for(int i=0,m=0; i < size; i+=2,m++)
{
char ch1, ch2;
ch1=(char)str[i]; // str contains the number I entered above as string, padded
ch2=(char)str[i+1];
int dig1, dig2;
if(isdigit(ch1)) dig1 = ch1 - '0';
else if(ch1>='A' && ch1<='F') dig1 = ch1 - 'A' + 10;
else if(ch1>='a' && ch1<='f') dig1 = ch1 - 'a' + 10;
if(isdigit(ch2)) dig2 = ch2 - '0';
else if(ch2>='A' && ch2<='F') dig2 = ch2 - 'A' + 10;
else if(ch2>='a' && ch2<='f') dig2 = ch2 - 'a' + 10;

// Contains data to write as a byte array; this is basically the 'data' part as mentioned in my above snippet
array1[m] = (char)(dig1*16 + dig2);
}

И этот array1[m] записывается на устройство, используя " Send как указано выше. Но когда я отлаживаю array1 содержит: 0000000000000015

Когда я прочитаю значение, которое я получаю, это правильно, это 00000000000000000000000000000105. Почему это работает?

спросил(а) 2021-01-25T15:10:27+03:00 4 месяца, 4 недели назад
1
Решение
132

Кажется, здесь есть несколько вопросов, поэтому некоторые дополнительные ответы:

Вы говорите, что array1 содержит: 0000000000000015, а не 105.

Ну, это массив, и каждый член показан как целое число из 8 бит в своем собственном праве. Например, последнее значение равно 5 или 05, что то же самое в конце концов. Аналогично, предпоследнее целое число равно 1 или 01.

Вы также написали "Скажем, что я хочу хранить 105 в десятичной системе. Я ввожу 00000000000000000000000000000105 ". На самом деле он не хранит 105 десятичных знаков. Он хранит 105 шестнадцатеричных чисел, что составляет 261 десятичный. Это строка для целочисленного преобразования, которая определяет окончательное значение. Если вы используете базу 18 (восьмеричные), то строка "105" станет целым числом 1 * 18 * 18 + 0 + 5 = 329 (десятичная), и это будет храниться как двоичный код 000000101001001.

ответил(а) 2021-01-25T15:10:27+03:00 4 месяца, 4 недели назад
45

Вы заново изобретаете несколько колес, но этого можно ожидать, если вы новичок в C++.

std::cin >> yourInteger будет читать целое число, не нужно его самостоятельно преобразовывать.


Ведущие нули обычно не выписываются, но в цельном типе C++ они всегда присутствуют. Например, int32_t всегда имеет 32 бита. Если он хранит 105 (0x69), он действительно сохраняет 0x00000069.

Таким образом, лучший способ, вероятно, состоит в том, чтобы memcpy что целое число для вашего sendBuffer. Вы должны скопировать sizeof(yourInteger) байты.

ответил(а) 2021-01-25T15:10:27+03:00 4 месяца, 4 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема