字节数据printf时为何前面多了0xffffff

void package_0x80(unsigned char *payload, short payload_len)
{
    XlinkHS_0x80_Send_Head_T send = {0};
    char send_buff[1024] = {0};
    int i = 0;
    int checkSum = 0;
    int send_len = 0;

    memset(&send, 0, sizeof(XlinkHS_0x80_Send_Head_T));
    send.u8Prefix = 0x80;
    send.u8Retry = 0;
    send.u16Length = (payload_len+2) | ((payload_len+2) >> 8);
    send.u32Address = ((1)&0xff) | (((0)>>8)&0xff) |
                      (((31)>>16)&0xff) | (((172)>>24)&0xff);;
    send.u16DataType = 0x172;
    send.u8HwPort = 0x82;        // lan to usb_cdc
    send.u8PacketType = 0;
    send.u8LocalPort = 0;
    send.u8Version = 1;
    send.u16ToPort = 0x4;
    send.u16FromPort = 0x2;    
    checkSum = crc_ccitt2((unsigned char*)&send, 44, payload, payload_len);
    
    memcpy(send_buff, (char *)&send, sizeof(XlinkHS_0x80_Send_Head_T));
    memcpy(send_buff + sizeof(XlinkHS_0x80_Send_Head_T), payload, payload_len);
    memcpy(send_buff + sizeof(XlinkHS_0x80_Send_Head_T) + payload_len, &checkSum, 2);

    send_len = sizeof(XlinkHS_0x80_Send_Head_T) + payload_len + 2;
    for (i = 0; i < send_len; i++) {
        printf("%.2x ",send_buff[i]);
    }
    printf("\n");
}

运行后输出:

ffffff80 00 18 00 01 00 00 00 72 01 ffffff82 00 00 01 04 00 02 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 5b 68 00 00 0b 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 02 ffffffd1 5a

发现有三处字节数据前面被加上了0xffffff,经观察,出现0xffffff的地方字节的最高位为1,说明是有符号类型和无符号类型导致的问题。

%x格式是无符号整数格式,程序中的变量为有符号类型,是类型转换带来的问题。

如0x80最高位的 bit 为1(有符号类型时即为负数)的话,在进行无符号类型转换时,前面所有bit 均补1。0x80=10000000b, 前方补24个1后就成了0xffffff80。

如0x18最高位的bit 为0,则转换时前面所有bit 补0。0x18=00011000b, 前方补24个0后还是0x18。

上面的问题修改如下:

    for (i = 0; i < send_len; i++) {
        printf("%.2x ",(unsigned char)send_buff[i]);
    }

再次运行:

80 00 18 00 01 00 00 00 72 01 82 00 00 01 04 00 02 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 5b 68 00 00 0b 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 02 d1 5a

程序输出正常;

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值