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
程序输出正常;