Название: Как работать с QByteArray Отправлено: demiurg от Сентябрь 19, 2013, 13:56 Собственно сабж!
Сокетом получают массив QByteArray. В нём данные, разбитые по байтам. Нужно с С вот такую функцию перегнать... unsigned int STXBUS_CRC16 (unsigned char *nData, unsigned char wLength) { unsigned char nTemp; unsigned int wCRCWord = 0xFFFF; while (wLength--) { nTemp = *nData++ ^ wCRCWord; wCRCWord >>= 8; wCRCWord ^= wCRCTable[nTemp]; } return wCRCWord; } Проблема в том - как обращаться к элементам массива? Т.е. допустим передать указатель на 5 байт...А потом двигаться по нему вперёд назад... Допустим для массива unsigned char - *(nData+5) аналогична nData[5] . А как это реализовать для QByreArray ? На попытку обращения к элементу... даёт 'QByteArray::operator QNoImplicitBoolCast() const' is private ... Название: Re: Как работать с QByteArray Отправлено: Old от Сентябрь 19, 2013, 13:59 Допустим для массива unsigned char - *(nData+5) аналогична nData[5] . А как это реализовать для QByreArray ? Вы не поверите, также:nData[5] Название: Re: Как работать с QByteArray Отправлено: demiurg от Сентябрь 19, 2013, 14:02 А чож он тогда ругаецО на приведение (unsigned char*)nData[5]
Название: Re: Как работать с QByteArray Отправлено: Bepec от Сентябрь 19, 2013, 14:20 char operator[] ( int i ) const
char operator[] ( uint i ) const Читайте ассистент. Он отдаёт char, а не char *. Название: Re: Как работать с QByteArray Отправлено: demiurg от Сентябрь 19, 2013, 14:26 char operator[] ( int i ) const Ступил. char operator[] ( uint i ) const Читайте ассистент. Он отдаёт char, а не char *. Конечно же.. вот так (unsigned char)nData[5]. Почему в unsigned char не переводит... Т.е. QByreArra *data data[5] эквивалентна *(data+5) - ссылается на элемент. (unsigned char)data[5] - выдаёт ошибку... (unsigned char)*data[5] - не выдаёт ошибку. Но я же уже вроде обратился к элементу по указателю... Название: Re: Как работать с QByteArray Отправлено: mutineer от Сентябрь 19, 2013, 15:11 QByreArray *data это указатель на QByreArray и чтобы вызвать у него оператор[] надо его сначала разыменовать: (*data)[5]
А вот это data[5] эквивалентно *(data + 5), только data указывает на QByteArray А ошибки неплохо бы читать и понимать что в них написано, а не просто констатировать факт их наличия Название: Re: Как работать с QByteArray Отправлено: demiurg от Сентябрь 19, 2013, 15:25 А вот это data[5] эквивалентно *(data + 5), только data указывает на QByteArray Так уже ж вроде разыменован...*(data + 5)....К указателю на QByteArray добавляем 5 и разыменовываем. Тоже самое, что data[5]. ??? Цитировать А ошибки неплохо бы читать и понимать что в них написано, а не просто констатировать факт их наличия Ну так он и вывел...QByteArray::operator QNoImplicitBoolCast() const' is private...Цитировать надо его сначала разыменовать: (*data)[5] *(*(data)+5)???????Тогда мы не к указателю добавим 5 , а к содержимому 0 элемента....Не? Название: Re: Как работать с QByteArray Отправлено: mutineer от Сентябрь 19, 2013, 15:28 К указателю на QByteArray добавляем 5 и что получаем? Элемент номер 5 в массиве из QByteArray. У тебя есть такой массив и тебе нужен из него QByteArray номер 5? Судя по вопросу нет, QByteArray у тебя один и тебе нужен пятый элемент из него. А для этого надо сделать (*data)[5]
data[5] сработает если data - это объект, а не указатель на объект Название: Re: Как работать с QByteArray Отправлено: demiurg от Сентябрь 19, 2013, 15:33 К указателю на QByteArray добавляем 5 и что получаем? Элемент номер 5 в массиве из QByteArray. У тебя есть такой массив и тебе нужен из него QByteArray номер 5? Судя по вопросу нет, QByteArray у тебя один и тебе нужен пятый элемент из него. А для этого надо сделать (*data)[5] Указатель на 5 элемент. Соответственно *(data+5) - это уже значение элемента. Т.е. data[5] - значение элемента, а data - указательна QByteArray... ???Название: Re: Как работать с QByteArray Отправлено: demiurg от Сентябрь 19, 2013, 15:38 data[5] сработает если data - это объект, а не указатель на объект Хм, странно. Я просто в С в основном сижу. там вот такое void func (unsigned char *PtR) { PtR[5]=10; }; *** unsigned char array[15]; func(&array[5]); Запишет в 10 элемент значение 10... Название: Re: Как работать с QByteArray Отправлено: mutineer от Сентябрь 19, 2013, 15:38 Блин, нет
Вот указатель на 5 байт из QByteArray Код
А вот непонятно что: Код
Название: Re: Как работать с QByteArray Отправлено: mutineer от Сентябрь 19, 2013, 15:41 data[5] сработает если data - это объект, а не указатель на объект Хм, странно. Я просто в С в основном сижу. там вот такое void func (unsigned char *PtR) { PtR[5]=10; }; *** unsigned char array[15]; func(&array[5]); Запишет в 10 элемент значение 10... В этом смысле unsigned char array[15] примерно эквивалентен QByteArray data; Но ты ведь data объявил указателем на QByteArray. Аналогию с сишным массивом придумай сам Советую подучить матчасть, ибо в адресной арифметике и указателях ты как-то плаваешь Название: Re: Как работать с QByteArray Отправлено: demiurg от Сентябрь 19, 2013, 15:54 В этом смысле Ну имя массива array - это и есть const указатель на 0 элемент массива. А array[] - как раз разадресует указатель...unsigned char array[15] примерно эквивалентен QByteArray data; Но ты ведь data объявил указателем на QByteArray. Аналогию с сишным массивом придумай сам Советую подучить матчасть, ибо в адресной арифметике и указателях ты как-то плаваешь Если я объявляю указатель типа unsigned char* ptr; ptr=&array[5], то ptr[5]=0x0А запишет в 10 элемент. -- data то я опеределил как указатель, но речь то не о data а о *(data+x)(разадресация(указатель+смещение)) иже data[х].... Получается в C++ с этим по другому? Название: Re: Как работать с QByteArray Отправлено: mutineer от Сентябрь 19, 2013, 15:58 В С++ с этим так же. Просто когда ты прибавляешь к char * пятерку, ты получаешь пятый по счету char от твоего указателя. Если ты прибавишь пятерку к QByteArray*, то ты получишь пятый по счету QByteArray начиная от указателя
Название: Re: Как работать с QByteArray Отправлено: Igors от Сентябрь 19, 2013, 15:59 Нужно с С вот такую функцию перегнать... А зачем ее перегонять, просто вызовите ееunsigned int STXBUS_CRC16 (unsigned char *nData, unsigned char wLength) Код
Название: Re: Как работать с QByteArray Отправлено: mutineer от Сентябрь 19, 2013, 16:03 Ну и да, в случае QByteArray data эти две записи не эквиваленты:
Код: data[5]; Код: *(data+5); Потому что первая разворачивается в data.operator[](5); а вторая в непонятно что Название: Re: Как работать с QByteArray Отправлено: demiurg от Сентябрь 19, 2013, 16:15 В С++ с этим так же. Просто когда ты прибавляешь к char * пятерку, ты получаешь пятый по счету char от твоего указателя. Если ты прибавишь пятерку к QByteArray*, то ты получишь пятый по счету QByteArray начиная от указателя Всё, въехал.Он же сдвинет на 5*(размер указателя данного типа-массива)... ;D а не на 5 размеров указателей -составляющих для этого массива. Получается аналогия для C чтото типа typedef struct { char поле1[х] поле2 поле3 поле4 } QByteArray; QByteArray *array; (*array).поле1[5] Спасибо :) Название: Re: Как работать с QByteArray Отправлено: demiurg от Сентябрь 19, 2013, 16:31 unsigned int sum = STXBUS_CRC16 ((unsigned char *) ba.data(), ba.size()); invalid conversion from 'char*' to 'unsigned char*'... В том то и прикол - как обратиться к массиву байт внутри QByteArray? Название: Re: Как работать с QByteArray Отправлено: Igors от Сентябрь 19, 2013, 16:59 unsigned int sum = STXBUS_CRC16 ((unsigned char *) ba.data(), ba.size()); invalid conversion from 'char*' to 'unsigned char*'... В том то и прикол - как обратиться к массиву байт внутри QByteArray? Код: unsigned int sum = STXBUS_CRC16 (ba.data(), ba.size()); |