Передача QByteArray, содержащего двоичные данные, в функцию по значению - PullRequest
0 голосов
/ 16 января 2020

Итак, я работаю над большой программой, которая обрабатывает двоичные данные, хранящиеся в QByteArrays. Сегодня я понял, что когда я передаю QByteArray в функцию по значению, например,

void myFunc(QByteArray data)
{
 // Do stuff
}

, то если мой QByteArray имеет 0x0 где-то в середине двоичного потока, например 0xA5 0x20 0x04 0x00 0x52. 0x52 обрезают, когда QByteArray передается в функцию.

Я представляю, что я мог бы просто передать QByteArray по значению в функцию, но в некоторых случаях мне нужна копия массива (для сохранение данных или добавление в очередь и т. д. c) и, к сожалению, у меня есть много-много строк кода, где такие функции передают скопированный QByteArrays.

Так что мне интересно, есть ли способ перегрузите оператор присваивания (или используйте другой метод), чтобы скопировать данные между двумя QByteArrays, не обрабатывая элементы 0x00 как строковые символы с нулевым символом в конце. Я пытаюсь найти самый простой подход к этой проблеме, без необходимости полностью потрошить мою программу и повторить все функции. Есть ли лучший альтернативный тип данных, который я могу использовать (где я могу просто сделать быстрый поиск / замену, или какую-нибудь функцию, в которую я могу их обернуть? Проблема

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    QByteArray data = QByteArrayLiteral("\xA5\x20\x04\x00\x52");

    doStuff(data);

    return a.exec();
}

void doStuff(QByteArray theData)
{
    // theData will contain only 0xA5 0x20 0x04 0x00 if you look from in here
}

ОБНОВЛЕНИЕ 2:

ОК, очевидно, после тестирования приведенного выше примера. Это действительно работает. Однако реальный сценарий, с которым я работаю в потоке, и мне нужно проверить больше. Будет обновлять, как только я сузить проблему более ...

1 Ответ

1 голос
/ 16 января 2020

Я не думаю, что это имеет какое-либо отношение к передаче QByteArray по значению, но больше похоже на то, как вы инициализируете свои массивы. Рассмотрим этот пример:

QByteArray data("\xA5\x20\x04\x00\x52");

qDebug( data.toHex() );

QByteArray data2;
data2.append( static_cast<char>( 0xA5 ) );
data2.append( static_cast<char>( 0x20 ) );
data2.append( static_cast<char>( 0x04 ) );
data2.append( static_cast<char>( 0x00 ) );
data2.append( static_cast<char>( 0x52 ) );

qDebug( data2.toHex() );

Вывод:

a52004
a520040052

Инициализация его строкой, которую он прерывает на 0-конце. Это также верно для QByteArray::toStdString().

РЕДАКТИРОВАТЬ:

Как отметил Фрэнк:

QByteArray data("\xA5\x20\x04\x00\x52", 5);

qDebug( data.toHex() );

действительно произведет то, что ожидается :

a520040052
...