1

我需要与没有 nthol 功能的 8 位设备通信。也不可能使用协议缓冲区库。

无论运行什么架构(不同的字节序,不同的位数),以下 C 函数都会产生相同的输出字符串:

void encode(uint32_t input, unsigned char* buf, int buf_len) {
  assert(sizeof(uint32_t) <= buf_len);
  buf[0] = input >> 24 & 0xFF;
  buf[1] = input >> 16 & 0xFF;
  buf[2] = input >> 8 & 0xFF;
  buf[3] = input & 0xFF;
}

以下函数将正确读取此类编码字符串并在所有架构上产生相同的结果:

void decode(const unsigned char* buf, int buf_len, uint32_t* output) {
  assert(sizeof(uint32_t) <= buf_len);
  *output = buf[0];
  *output <<= 8;
  *output |= buf[1];
  *output <<= 8;
  *output |= buf[2];
  *output <<= 8;
  *output |= buf[3];
}

是否有可能在 8 位处理器上 32 位整数由于某种原因无法正确处理?

4

2 回答 2

1

是的,它会起作用。无论机器具有哪种字节序或字长,C 移位运算符都会做正确的事情。

只需记住在与此协议通信的所有程序中执行完全相同的操作。

于 2012-09-21T07:29:19.363 回答
1

是的,看起来不错。一些评论:

  1. 当代码依赖于这一事实时,您应该使用uint8_t而不是假设unsigned char是 8 位。
  2. 使用局部变量进行接收会更简洁(imo),因此您不必一直通过指针切换output
  3. 您可能只返回解码后的值,使decode()函数更简洁。

-

 uint32_t decode(const uint8_t *buf, size_t buf_len) {
   uint32_t out = 0;
   assert(sizeof out <= buf_len);
   out |= buf[0];
   out <<= 8;
   out |= buf[1];
   out <<= 8;
   out |= buf[2];
   out <<= 8;
   out |= buf[3];
   return out;
 }
于 2012-09-21T07:42:29.433 回答