Первой точка: нет такого понятия, как шестнадцатеричных числа. Числа - это числа. Мы говорим о целых числах здесь. Если вы говорите 16, 0x10, 020 и т. Д., Это все равно. 0x10 является «шестнадцатеричным» только в том смысле, что вы записываете его в шестнадцатеричной системе. Он ничего не меняет о самом номере, он не делает его «шестнадцатеричным»! Это все равно номер, который вы получаете, увеличиваясь с нуля шестнадцать раз.
Единственная причина для шестнадцатеричного кода заключается в том, что, вероятно, документация устройства дает командные пакеты в шестнадцатеричном формате. Это совершенно произвольный выбор. Вы можете скопировать цифры в шестнадцатеричной форме из документации или преобразовать их в другую базу, если это имеет для вас больше смысла.
Итак, шестнадцатеричное представление, конечно, полностью зависит от вас, вам не нужно явно его использовать. Но вам нужно использовать C-постоянные массивы в некотором роде - они делают вещи простыми и низкими накладными расходами. Предположим, что ваши команды должен был состоять из трех байтов с десятичными значениями 16, 33, 47.
Вы можете кодировать его следующим образом:
static const char cmdBuf[] = { 16, 33, 47 };
const auto cmd = QByteArray::fromRawData(cmdBuf, sizeof(cmdBuf));
Массив байт cmd
инициализируется без копирования данных, так что быстро и эффективно. cmdBuf
должен быть статическим, так как он должен существовать до тех пор, пока cmd
или любые его (мелкие) копии.
Вы можете использовать строковый литерал для инициализации массива, используя шестнадцатеричные escape-последовательности для непечатаемых символов и другие символы печати.
static const char cmdBuf[] = "\x10!/";
const auto cmd = QByteArray::fromRawData(cmdBuf, sizeof(cmdBuf)-1);
Причина sizeof(...)-1
является то, что cmdBuf
4 байта длиной - строка символов заканчивается завершающим нуль, что вы на самом деле не нужны.
Если вы хотели бы использовать шестигранный представление для всех байтов, вы бы
static const char cmdBuf[] = "\x10\x21\x2F";
const auto cmd = QByteArray::fromRawData(cmdBuf, sizeof(cmdBuf)-1);
// or
static const char cmdBuf[] = { 0x10, 0x21, 0x2F };
const auto cmd = QByteArray::fromRawData(cmdBuf, sizeof(cmdBuf));
Конечно, вы могли бы использовать восьмеричное, а также:
static const char cmdBuf[] = "\020\041\057";
const auto cmd = QByteArray::fromRawData(cmdBuf, sizeof(cmdBuf)-1);
// or
static const char cmdBuf[] = { 020, 041, 057 };
const auto cmd = QByteArray::fromRawData(cmdBuf, sizeof(cmdBuf));
Или любое сочетание из них!
static const char cmdBuf[] = "\020\x21/";
const auto cmd = QByteArray::fromRawData(cmdBuf, sizeof(cmdBuf)-1);
//or
static const char cmdBuf[] = { 16, 0x21, 057 };
const auto cmd = QByteArray::fromRawData(cmdBuf, sizeof(cmdBuf));
В строке буквальной, закодировать ли вы все это, как шестнадцатеричные/восьмеричные побеги или использовать печатные символы до вас, это вопрос стиля. Если значения в ваших командах не имеют значения печатаемых символов, числовая (шестнадцатеричная или восьмеричная) кодировка в строковом литерале или инициализаторе массива, вероятно, лучше.
При выборе между восьмеричным и шестнадцатеричным символами следуйте структуре байтов команд или собственных предпочтений.Если байты имеют структуру, которая каким-то образом разбивается на группы из 2 + 3 + 3 бита, то восьмеричный - это хороший способ сделать его удобочитаемым. В противном случае используйте hex или decimal. Все дело в том, что облегчает чтение кода - машине все равно, двоичный вывод будет идентичным независимо от того, каким образом вы это сделаете.
Откуда берутся эти шестнадцатеричные числа? пожалуйста, напишите [mcve] –
'ba.append (" \ x01 \ x02 \ x7A ")' – peppe
Кроме того, 'append' возвращает ссылку на себя, поэтому вы также можете ее связать:' ba.append (0x01) .append (0x02) .append (0x7A); ' –