C - 使用char和int创建数据包

时间:2013-08-15 17:03:48

标签: c char int append packet

我正在寻找构建一个由十六进制值组成的二进制字符串...我已经了解到sprintf不是完成此任务的正确方法。我有一个真正简单的gui来收集需要发送设备的配置设置。值可以是签名的,并且始终是数字的。我有一组值,如:

#define PKTHEAD 0xA5
#define VALONE  0xA0
#define VALTWO  0xA1
#define VALTHREE 0xA2
#define PKTTAIL 0x5A

signed int val1 = 10000; //0x2710
signed int val2 = -84;   //0xFFAC
signed int val3 = -175001 //0xFFFD5467

我的最终目标是拥有类似于“PKTHEAD | PKTHEAD | PKTHEAD | VALONE | val1 | VALTWO | val2 | VALTHREE | val3 | PKTTAIL | PKTTAIL | PKTTAIL”的数据包,并且十六进制表示将是A5A5A5A000002710A1FFFFFFACA2FFFD54675A5A5A。

现在我正在这样做:

int main(int argc, char *argv[])
{
    int numBytes = 10;
    signed char *tmp;
    signed char *pyld;
    pyld = calloc(numBytes, sizeof(char));

    signed int val1 = 10000; //0x2710
    signed int val2 = -84;   //0xFFAC
    signed int val3 = -175001 //0xFFFD5467

    tmp = pyld;

    *(tmp + (numBytes - 1)) = DACHEAD;
    *(tmp + (numBytes - 2)) = DACHEAD;
    *(tmp + (numBytes - 3)) = DACHEAD;
    *(tmp + (numBytes - 4)) = VALONE;
    *(tmp + (numBytes - 5)) = val1;
    printf("payload = %hhx%hhx%hhx%hhx%hx%hx%hhx%hx\n", pyld[9], pyld[8], pyld[7], pyld[6], pyld[5], pyld[4], pyld[3], pyld[2], pyld[1], pyld[0]);
}

输出为:“payload = a5a5a5a0100a1ffac”

我的val1值不正确,我想知道是否有更好的方法来编写此数据包。我应该做点位移吗?

非常感谢任何帮助。

谢谢!

1 个答案:

答案 0 :(得分:0)

通过网络发送数据的更好方法是使用序列化库。例如,请参阅this question

此外,如果您不想使用外部库,则应首先了解所需的integer尺寸,16 bit32 bitendianness(并相应地转换)您的设备使用并且总是更喜欢使用memcpy将正确大小的值放入二进制缓冲区。