我正在寻找构建一个由十六进制值组成的二进制字符串...我已经了解到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值不正确,我想知道是否有更好的方法来编写此数据包。我应该做点位移吗?
非常感谢任何帮助。
谢谢!
答案 0 :(得分:0)
通过网络发送数据的更好方法是使用序列化库。例如,请参阅this question
此外,如果您不想使用外部库,则应首先了解所需的integer
尺寸,16 bit
或32 bit
,endianness
(并相应地转换)您的设备使用并且总是更喜欢使用memcpy
将正确大小的值放入二进制缓冲区。