crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

2 страниц V   1 2 >  
Ответить в данную темуНачать новую тему
> Беззнаковые байты в QByteArray
rcdimon
  опции профиля:
сообщение 10.10.2010, 13:54
Сообщение #1


Студент
*

Группа: Участник
Сообщений: 69
Регистрация: 27.10.2009
Пользователь №: 1183

Спасибо сказали: 1 раз(а)




Репутация:   0  


QByteArray arr;
arr.append(129);

int a = arr[0]; //-127
unsigned b = arr[0]; // 4294967169


Как получить свои 129??
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
BRE
  опции профиля:
сообщение 10.10.2010, 14:01
Сообщение #2


Профессионал
*****

Группа: Участник
Сообщений: 1112
Регистрация: 6.3.2009
Из: Ростов-на-Дону
Пользователь №: 591

Спасибо сказали: 264 раз(а)




Репутация:   44  


Цитата(rcdimon @ 10.10.2010, 14:54) *
Как получить свои 129??


unsigned b = (uchar)arr[0];

Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
rcdimon
  опции профиля:
сообщение 10.10.2010, 14:05
Сообщение #3


Студент
*

Группа: Участник
Сообщений: 69
Регистрация: 27.10.2009
Пользователь №: 1183

Спасибо сказали: 1 раз(а)




Репутация:   0  


unsigned b = (uchar)arr[0];


Хм. и правда работает. а я пробовал

unsigned b = (uint)arr[0];

Не получалось. а почему?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 10.10.2010, 15:48
Сообщение #4


фрилансер
******

Группа: Участник
Сообщений: 2900
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


Цитата(rcdimon @ 10.10.2010, 17:05) *
unsigned b = (uint)arr[0];
Не получалось. а почему?

тоже должно было получиться
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
BRE
  опции профиля:
сообщение 10.10.2010, 17:43
Сообщение #5


Профессионал
*****

Группа: Участник
Сообщений: 1112
Регистрация: 6.3.2009
Из: Ростов-на-Дону
Пользователь №: 591

Спасибо сказали: 264 раз(а)




Репутация:   44  


Цитата(Алексей1153 @ 10.10.2010, 16:48) *
тоже должно было получиться

Не должно. :)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 10.10.2010, 18:56
Сообщение #6


фрилансер
******

Группа: Участник
Сообщений: 2900
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


BRE, да, в отладчике зыркнул, расширяет знак :) Не могу понять, только, почему.

зато явное преобразование к незнаковому char работает
unsigned b = (uchar)arr[0];

скорее всего корявая работа оператора [] , который возвращает не просто char , а QByteRef , я уж не стал дальше копать, что он там вертает (скорее всего int)

ещё один довод в пользу использования STL :)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
BRE
  опции профиля:
сообщение 10.10.2010, 19:07
Сообщение #7


Профессионал
*****

Группа: Участник
Сообщений: 1112
Регистрация: 6.3.2009
Из: Ростов-на-Дону
Пользователь №: 591

Спасибо сказали: 264 раз(а)




Репутация:   44  


Дело вовсе не в 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
Сообщение #8


фрилансер
******

Группа: Участник
Сообщений: 2900
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


да я понимаю, откуда минус берётся:

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
Сообщение #9


Профессионал
*****

Группа: Участник
Сообщений: 1112
Регистрация: 6.3.2009
Из: Ростов-на-Дону
Пользователь №: 591

Спасибо сказали: 264 раз(а)




Репутация:   44  


Цитата(Алексей1153 @ 10.10.2010, 20:12) *
вот это я бы написал сразу нормально
std::vector<uchar> arr;

А почему с uchar нормально, а с char нет? :)
QByteArray в Qt часто используется как инструмент для работы с обычными сишными строками, поэтому и заточен для работы char.
А так есть же и QVector<uchar>.

Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 10.10.2010, 19:21
Сообщение #10


фрилансер
******

Группа: Участник
Сообщений: 2900
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


Цитата(BRE @ 10.10.2010, 22:18) *
А почему с uchar нормально, а с char нет?

смотри самый первый пост этой темы. Вот почему
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

2 страниц V   1 2 >
Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 30.9.2020, 19:28