【问题标题】:QByteArray to Integer conversion produces incorrect resultsQByteArray 到 Integer 的转换会产生不正确的结果
【发布时间】:2017-04-04 02:05:00
【问题描述】:

我正在尝试将字节数组转换为整数:

QByteArray b = QByteArray::fromHex("00008000");
quint32 result = b[3];
result += b[2] << 8;
result += b[1] << 16;
result += b[0] << 24;

但我得到的是4294934528 而不是32768。这里有什么问题?

【问题讨论】:

    标签: c++ qt5 qbytearray


    【解决方案1】:

    QByteArraychars 的数组。显然,您平台上的char 已签名且为 8 位宽。因此,您的问题可以提炼为:

    char c = 0x80;
    quint32 = c << 8;
    

    标准要求:

    N4606 § 4.8 [conv.integral] / 3

    如果目标类型是有符号的,如果可以,则值不变 以目的地类型表示;否则,值为 实现定义。

    在这种情况下(与 2 的补码系统一样),0x80 映射到 std::numeric_limits&lt;char&gt;::min() == -128,这仅是合乎逻辑的,因为它们共享相同的底层位模式。

    现在,-128 &lt;&lt; 8 定义为 -128 * 28,即 -32768。

    最后,从-32768 到 32 位无符号整数的转换定义明确并产生4294934528

    【讨论】:

    • 我最终使用QDataStream 进行转换。以防万一有人感兴趣。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-14
    • 2015-10-12
    • 2015-01-06
    • 1970-01-01
    • 1970-01-01
    • 2020-09-03
    相关资源
    最近更新 更多