qbytearray.at() в беззнаковое целое

Хорошо, у меня есть вопрос из двух частей о преобразовании элемента в QByteArray (должен быть char, верно?) в целое число без знака.

Вот мой код:

QByteArray data_read_buffer;

unsigned int data_recieved_size = 0;

/* the code below is an external function that populates the QbyteArray. shouldn't be important putting only to show that I assign a value to the byteArray./*

readFromComPortSafe(data_read_buffer); 

data_recieved_size  = static_cast<unsigned int>((data_read_buffer.at(2)));

В порядке. Таким образом, результат, который я возвращаю в data_recieved_size, неверен «каждый раз». Я захожу в отладчик, и когда я проверяю значение data_read_buffer, я получаю это:

\000\003\203\00\205.... (и т. д. мы с некоторым символом с умляутом)

Когда я проверяю значение data_recieved_size, я получаю 4294967171.

Итак, мой первый вопрос заключается в следующем.

Я делаю что-то не так с преобразованием из char в unsigned int?

Мой второй вопрос заключается в следующем:

Что представляет \203 в qByteArray? Наверное, я не понимаю, на что смотрю. Насколько я понимаю, тип char является символом Юникода???? Я ожидал, что второй элемент в QByteArray будет 0x83 или 131. Как это перевести на \203?

Если бы кто-нибудь мог дать некоторое представление об этом, я был бы признателен.

Спасибо


person user254340    schedule 24.07.2014    source источник


Ответы (2)


char могут быть подписаны или не подписаны в зависимости от вашей платформы, в вашем случае они подписаны.

Подумайте о том, что происходит, когда вы вызываете data_read_buffer.at и возвращаете значение -125:

  • -125 as a char is 0x83
  • Затем это значение преобразуется в int внутри static_cast, т.е. 0xffffff83
  • static_cast теперь преобразует это значение в unsigned int, которое просто копирует биты (по крайней мере, на машинах с дополнением до двух).
  • 0xffffff83 as an unsigned int is 4,294,967,171

Если вы хотите привести к unsigned int и избежать расширения знака, вам нужно сделать что-то вроде

static_cast<unsigned int>(static_cast<unsigned char>(data_read_buffer.at(2)));
person user657267    schedule 25.07.2014
comment
Спасибо. Теперь это имеет смысл. - person user254340; 25.07.2014

Тип char обычно подписан. Хотя это не очевидно, вы расширяете его до 32 бит как значение со знаком, а затем интерпретируете его как значение без знака. Если вы вставите static_cast< unsigned char >, вы расширите беззнаковое значение.

person Khouri Giordano    schedule 25.07.2014