QString нюансы

QString интереснейший класс с точки зрения изучения С плюс плюс.

  • inline
     - эта функция будет определена в разных единицах трансляции, игнорировать это. Линковщик должен убедится, что все единицы трансляции используют один и тот же экземпляр.



На Qt 4.8.1 замечено странное поведение arg или number. Это преобразование числа в строку.

А именно значения байта в строку (hex формат). Что именно удивляет это когда идет вывод последовательно нескольких байт, то после предыдущего байта со значением '0x3F' или  '0x0F' идет какая-то лажа.

for(int i = 0; i < ba.size();   i)
{

	UINT64 iii =0;
	iii = iii | ba.at(i);

	QString str = QString("%1 ").arg(iii,  2, 16, QLatin1Char('0'));
	qDebug()<< str << " значение " << iii;

	if(str.length()>3)
		str = QString("%1 ").arg(iii,  2, 16, lch);

}

Вывод такой пример, сразу понятно что фигня какая-то на после байта со значением 'F' в левой или правой части байта:

"53 "   value  83 
"51 "   value  81 
"4c "   value  76 
"69 "   value  105 
"00 "   value  0 
"40 "   value  64 
"20 "   value  32 
"20 "   value  32 
"2e "   value  46 
"3f "   value  63 
"ffffffffffffffd9 "   value  18446744073709551577 тут должно быть "d9" !!! 
"0d "   value  13 
"00 "   value  0 
"00 "   value  0 
"00 "   value  0 
"02 "   value  2 
"0f "   value  15 
"ffffffffffffffa3 "   value  18446744073709551523 
"00 "   value  0 
"0f "   value  15 
"ffffffffffffffd0 "   value  18446744073709551568 
"0f "   value  15 
"ffffffffffffffa3 "   value  18446744073709551523 

Проверяем не сошли ли мы с ума, пишем свою функцию и все работает правильно:

QString getDumpHexStr(const char* mem, int size, QLatin1Char &limiter)
{
    QString str;
    QChar val = *mem;

    char aaa[]={'0',
            '1',
            '2',
            '3',
            '4',
            '5',
            '6',
            '7',
            '8',
            '9',
            'A',
            'B',
            'C',
            'D',
            'E',
            'F'
           };

    QString res;

    for (int ii = 0; ii < size; ii  )
    {
        char right = *(char *) (mem   ii) & 0x0F;

        char left = (*(char *) (mem   ii) & 0xF0) >> 4;

        res.append( aaa[left]);
        res.append( aaa[right]);

        if( limiter != NULL)
            res.append( limiter);



    }
    return res;
}

Не знаю, но проблема в исходниках Qt 4.8.1. Возможно неаккуратно исходники (случайно) как-то изменили (бывает такое)...