【问题标题】:convert long int > 255 into a uint8_t array [duplicate]将 long int > 255 转换为 uint8_t 数组 [重复]
【发布时间】:2016-03-22 11:23:32
【问题描述】:

我正在使用 Particle Photon 微控制器,需要通过 TCP 发送值 >> 255。我需要将其转换为 uint8_t 数组,以便我可以使用 client.write((int8_t *data), int sizeof(packet)); 我怎样才能实现它?

【问题讨论】:

  • 您可以将其分配给数组中的下一个int8_t,然后向右移动直到达到零。这是最简单的解决方案,但它会将最低有效位放在首位。

标签: c++ uint8t


【解决方案1】:

如果可能,为您的数据选择一致的“字节序”——“大字节序”是二进制网络协议的典型特征——它用于 IP、UDP、TCP 等中的标头字段。

鉴于此,您可以使用htonX 系列函数将数据从主机格式(可能是任何一种字节序格式)转换为网络格式,然后在收到时ntohX 将其再次转换回来,例如:

uint32_t netword = htonl(data);

[在大端系统上,这些函数成为“无操作”]

编辑哦 - 我错过了“微控制器”位 - 你可能没有这些功能可用:(

【讨论】:

  • 您是否有任何证据表明在大型系统上这些功能变为无操作?因为我什么都看不到。
  • @Seb 我不知道一个好的编译器是否可以完全优化它们,但在大端系统ntohX(v) == v 上,即它是身份函数。
  • 这个答案是错误的,因为您将“主机字节顺序”与“主机(可能是任何一种字节序格式)”混淆了。您认为 htonl 的 'h' 部分会有所不同。它没有。主机字节顺序总是小端。
  • 所以当你写htonl(x) 你说x 是主机字节顺序,你希望它转换成网络字节顺序。它是否已经按网络字节顺序无关紧要,因为您告诉它它是主机字节顺序并且您希望它交换。
  • @Seb 你完全错了——在大多数现代系统上,主机顺序是小端序,但远不能保证。 FWIW,网络协议是我的专长 - 在处理 IETF 二进制协议时,您应该始终在写入线路时使用 htonX,在从线路读取时使用 ntohX
【解决方案2】:

使用了 ScruffR 在this 帖子上所说的内容

编辑 以前的版本实际上并没有正确地完成这项工作。 采用的解决方案,没有人(尽管投票反对)提供

char buf[SIZEBUFF];
sprintf(buf,"%s",float2send);
sprintf(buf,"%ld",longInt2send);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多