Версия для печати темы
Форум на CrossPlatform.RU _ Qt Общие вопросы _ Беззнаковые байты в QByteArray
Автор: rcdimon 10.10.2010, 13:54
QByteArray arr;
arr.append(129);
int a = arr[0]; //-127
unsigned b = arr[0]; // 4294967169
Как получить свои 129??
Автор: BRE 10.10.2010, 14:01
Цитата(rcdimon @ 10.10.2010, 14:54)
Как получить свои 129??
unsigned b = (uchar)arr[0];
Автор: rcdimon 10.10.2010, 14:05
unsigned b = (uchar)arr[0];
Хм. и правда работает. а я пробовал
unsigned b = (uint)arr[0];
Не получалось. а почему?
Автор: Алексей1153 10.10.2010, 15:48
Цитата(rcdimon @ 10.10.2010, 17:05)
unsigned b = (uint)arr[0];
Не получалось. а почему?
тоже должно было получиться
Автор: BRE 10.10.2010, 17:43
Цитата(Алексей1153 @ 10.10.2010, 16:48)
тоже должно было получиться
Не должно.
Автор: Алексей1153 10.10.2010, 18:56
BRE, да, в отладчике зыркнул, расширяет знак Не могу понять, только, почему.
зато явное преобразование к незнаковому char работает
unsigned b = (uchar)arr[0];
скорее всего корявая работа оператора [] , который возвращает не просто char , а QByteRef , я уж не стал дальше копать, что он там вертает (скорее всего int)
ещё один довод в пользу использования STL
Автор: BRE 10.10.2010, 19:07
Дело вовсе не в QByteArray и не в STL.
Попробуй такой код, эффект будет таким же:
#include <iostream>
#include <vector>
int main ( int argc, char *argv[] )
{
std::vector<char> arr;
arr.push_back( 129 );
unsigned b = (unsigned)arr[0];
std::cout << b << std::endl;
return 0;
}
Если преобразовать b к signed, то станет понятно, что число 4294967169 как раз обозначет -127.
Автор: Алексей1153 10.10.2010, 19:12
да я понимаю, откуда минус берётся:
129 == 0x81
если это char , то при увеличении размерности знак (0x80) тоже расширяется и получается 0xFFFFFF81 , что и есть 4294967169
а всё остальное - это лишь представление
мне другое дико - если работаешь с байтом, зачем там char, а не unsigned char. Отсюда и глюки.
Цитата(BRE @ 10.10.2010, 22:07)
std::vector<char> arr;
вот это я бы написал сразу нормально
std::vector<uchar> arr;
Автор: BRE 10.10.2010, 19:18
Цитата(Алексей1153 @ 10.10.2010, 20:12)
вот это я бы написал сразу нормально
std::vector<uchar> arr;
А почему с uchar нормально, а с char нет?
QByteArray в Qt часто используется как инструмент для работы с обычными сишными строками, поэтому и заточен для работы char.
А так есть же и QVector<uchar>.
Автор: Алексей1153 10.10.2010, 19:21
Цитата(BRE @ 10.10.2010, 22:18)
А почему с uchar нормально, а с char нет?
смотри самый первый пост этой темы. Вот почему
Автор: BRE 10.10.2010, 19:23
Цитата(Алексей1153 @ 10.10.2010, 20:21)
Цитата(BRE @ 10.10.2010, 22:18)
А почему с uchar нормально, а с char нет?
смотри самый первый пост этой темы. Вот почему
Ну так ССЗБ.
Цитата
А так есть же и QVector<uchar>.
Автор: Алексей1153 10.10.2010, 19:31
Цитата(BRE @ 10.10.2010, 22:23)
Ну так ССЗБ.
чиво ругаесси ? ))
Форум Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)