如何使用int16_t值的低字节和高字节?

时间:2019-06-26 14:10:01

标签: c++ qt byte endianness

我使用Qt串行通过串行端口发送命令。该命令包含一个带符号的16位整数(xx),范围从-4096到4096,高字节先发送。命令创建如下:

int16_t xi = 0;

for (int i=0; i<280; i++){
    xi = i;

    // index =     0   1   2  3   4   5
    // command = {'A','w','x','x','L','H'}
    unsigned char command[6] = {'A','w','x','x','L','H'};

    command[2] = xi >> 8;
    command[3] = xi & 0xFF;

    int len = strlen((char*)command);
    qDebug()<<"strlen: "<<len;
}

该命令对于除0到256之间的所有值都可以正常工作。我不明白为什么0到256之间的值的字符串长度为2?我做错了什么?任何帮助表示赞赏。

编辑:如何更改command[2] = xi >> 8;(或其他部分)以避免被截断并获得-4096到4096之间所有整数的完整命令?

1 个答案:

答案 0 :(得分:1)

根本问题在command[2] = xi >> 8;部分。

当将数组的第3个元素右移8位时,它作为int(空终止符)变为0。完成该操作后,strlen返回2,因为第三个元素是空终止符。由于256之后,向右移8位不会使值变为0,因此strlen会按预期工作。但是,该行为是不确定的,因为strlen期望您的字符串以null结尾。

相关问题