gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 17:48:53 25 4
gpt4 key购买 nike

我正在寻找构建一个由十六进制值组成的二进制字符串...我了解到 sprintf 不是完成此操作的正确方法。我有一个真正简单的 GUI 来收集需要发送到设备的配置设置。这些值可以带符号并且始终是数字。我有一组值(value)观,例如:

#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 值不正确,我想知道是否有更好的方法来组成这个数据包。我应该进行位移位吗?

非常感谢任何帮助。

谢谢!

最佳答案

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

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

关于C - 使用 char 和 int 创建数据包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18257768/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com