2015-08-19 2 views
2

У меня есть куча шестнадцатеричных цифр, но я не чувствую, что делаетAppend множественным шестнадцатеричные числа в QByteArray одновременно

QByteArray ba; 
ba.append(0x01); 
ba.append(0x02); 
ba.append(0x7A); 
... 

Могу ли я сделать это в одной строке? Может быть, с помощью QString манипуляции?

Я отправляю сообщение через последовательный канал связи QExtSerialPort и мне нужно хранить команды Hex в QByteArray, так что я могу использовать qint64 write(const QByteArray &data)

+1

Откуда берутся эти шестнадцатеричные числа? пожалуйста, напишите [mcve] –

+4

'ba.append (" \ x01 \ x02 \ x7A ")' – peppe

+2

Кроме того, 'append' возвращает ссылку на себя, поэтому вы также можете ее связать:' ba.append (0x01) .append (0x02) .append (0x7A); ' –

ответ

6

Первой точка: нет такого понятия, как шестнадцатеричных числа. Числа - это числа. Мы говорим о целых числах здесь. Если вы говорите 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. Все дело в том, что облегчает чтение кода - машине все равно, двоичный вывод будет идентичным независимо от того, каким образом вы это сделаете.