【问题标题】:How do you concatenate several long int into a char array?你如何将几个 long int 连接成一个 char 数组?
【发布时间】:2020-07-28 17:56:29
【问题描述】:

我正在我的 Arduino 中处理一个项目,我想通过一个非常慢的无线电链路将多个值发送到目的地。

我需要发送 7 个long 变量,每个变量有 4 个字节。因此,与其将它们转换为最多 64 字节数据的十六进制字符串,我更愿意将它们全部存储在一个数组中,char payload[32];

我试着做这样的事情:

long first = 5000;
long second = 10000;
char payload[8];
long* pointer;

pointer = &payload[0];
*pointer = first;
pointer = &payload[4];
*pointer = second;

但我遇到了转换错误。

这样做的正确方法是什么?

【问题讨论】:

  • 为什么不简单地uint32_t payload[7]

标签: c++ arduino


【解决方案1】:

char*long* 不兼容,因此在分配 pointer 变量时需要显式类型转换,例如:

long first = 5000;
long second = 10000;
char payload[sizeof(long)*2];
long* pointer;

pointer = reinterpret_cast<long*>(&payload[0]);
*pointer = first;
pointer = reinterpret_cast<long*>(&payload[4]);
*pointer = second;

或者(更安全),改用memcpy(),例如:

long first = 5000;
long second = 10000;
char payload[sizeof(long)*2];

memcpy(&payload[0], &first, sizeof(first));
memcpy(&payload[4], &second, sizeof(second));

话虽如此,如果您想确保使用 32 位整数进行传输,您确实应该使用 int32_t 而不是 longlong 在所有平台上都不是 32 位的,尽管它在 Arduino 上(也就是说,将来永远不会改变)。当您需要使用特定的位大小时,您应该始终使用固定宽度类型。

【讨论】:

  • 现在越来越不重要了,但也要留意endian 源和目标之间的差异。 ntohl and htonl 可能会派上用场。
猜你喜欢
  • 2022-08-17
  • 1970-01-01
  • 1970-01-01
  • 2020-11-13
  • 1970-01-01
  • 2012-09-29
  • 1970-01-01
  • 2018-10-06
  • 1970-01-01
相关资源
最近更新 更多