2015-06-05 5 views
3

В моем проекте я работаю с QByteArrays, добавляя данные к ним по мере прохождения программы. В большинстве случаев простой quint8 добавляется просто отлично, используя QByteArray::append(). Но когда quint16 добавляемый, только 1 байт добавляемый вместо 2.Append quint16/unsigned short to QByteArray быстро

QByteArray ba = QByteArray::fromHex("010203"); 
quint number(300);//300 in hex is 012c 

ba.append(number);//What should be appended instead of just number? 

//the current incorrect result is 
ba.toHex() == "0102032c" 

//the desired result is 
ba.toHex() == "010203012c" 

Я уже пытался, но он просто вставляет значение в виде строки (4 байта):

ba.append(QByteArray::number(number, 16)); 

Что следует добавить к QByteArray, чтобы оба байта «числа» добавлялись вместо одного байта? Кроме того, самый быстрый способ является предпочтительным, поскольку для этой программы требуется отличное время работы. Так что абсолютно никакого преобразования в QStrings.

Спасибо за ваше время.

+0

Какой смысл вы ожидаете при добавлении 'quint16'? –

+0

Я считаю, большой эндиан. Он должен быть добавлен 012c – mrg95

+0

Чтение документа Я не вижу следа 'QByteArray.append (quint)' ... –

ответ

6

Самостоятельно QByteArray поддерживает только добавление байтов; для добавления тупоконечника представление фиксированного размера целых типов вы можете создать свой собственный operator<< (или то, что вы предпочитаете) перегружает, используя соответствующие битовые сдвиги:

QByteArray &operator<<(QByteArray &l, quint8 r) 
{ 
    l.append(r); 
    return l; 
} 

QByteArray &operator<<(QByteArray &l, quint16 r) 
{ 
    return l<<quint8(r>>8)<<quint8(r); 
} 

QByteArray &operator<<(QByteArray &l, quint32 r) 
{ 
    return l<<quint16(r>>16)<<quint16(r); 
} 

Это позволяет вам писать код, как:

QByteArray b; 
b<<quint16(300);  // appends 0x01 0x2c 
b<<quint8(4);  // appends 0x04 
b<<quint16(4);  // appends 0x00 0x04 
b<<quint32(123456); // appends 0x00 0x01 0xe2 0x40 
b<<quint8(1)<<quin16(2)<<quint32(3); // appends 0x01 0x00 0x02 0x00 0x00 0x00 0x03 

Вы, вероятно, следует избегать написания

QByteArray b; 
b<<1; 

потому, что в теории выход зависит от размера текущей платформы целого (хотя AFAIK на все платформы, поддерживаемые Qt int, 32 бит).

+0

Работает безупречно. Большое спасибо за быстрый ответ :) – mrg95

+0

Ненавижу, чтобы спросить об этом, но как насчет возврата? Итак, из QByteArray, содержащего «012c», в qint16? Я уже пробовал ba.mid (3,2). ToUShort (0,16), однако это не сработает, поскольку оно не смотрит на двоичные данные. – mrg95

+1

Чтобы прочитать значение большого числа для целого числа, обычным способом является «для каждого байта, прочитанного влево, сдвинуть цель на 8 и ИЛИ, считая байт в цель». Это проще сделать с фактическим потоком, который отслеживает позицию чтения. –