1

好的,我有一个关于将元素 int 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类型是unicode字符????我期待 QByteArray 中的第二个元素是 0x83 或 131。这如何转换为 \203?

如果有人可以对此提供一些见解,我将不胜感激。

谢谢

4

2 回答 2

1

chars 可以签名或未签名,具体取决于您的平台,在您的情况下,它们已签名。

想想当你调用时会发生什么data_read_buffer.at,返回值是-125

  • -125char照原样0x83
  • 然后将该值转换为int内部的一个static_cast,即0xffffff83
  • static_cast现在将此值转换为unsigned int,它只是复制位(至少在二进制补码机器上)。
  • 0xffffff83作为一个unsigned int是 4,294,967,171

如果您想强制转换unsigned int并避免符号扩展,您需要执行类似的操作

static_cast<unsigned int>(static_cast<unsigned char>(data_read_buffer.at(2)));
于 2014-07-25T00:22:00.920 回答
0

char类型通常是有符号的。虽然这并不明显,但您将其扩展为 32 位作为有符号值,然后将其重新解释为无符号值。如果您插入 a static_cast< unsigned char >,那么您将扩大一个无符号值。

于 2014-07-25T00:22:49.120 回答