0

我正在寻找一个由十六进制值组成的二进制字符串......我了解到 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]);
}

输出为:“有效载荷 = a5a5a5a0100a1ffac”

我的 val1 值不正确,我想知道是否有更好的方法来组成这个数据包。我应该做位移吗?

任何帮助是极大的赞赏。

谢谢!

4

1 回答 1

0

通过网络发送数据的更好方法是使用序列化库。例如,看到这个问题

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

于 2013-08-15T17:34:56.757 回答