便携式编码32位整数以与8位设备通信

时间:2012-09-21 07:25:40

标签: c encoding portability 8-bit

我需要与没有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位整数由于某种原因无法正确处理?

2 个答案:

答案 0 :(得分:1)

是的,它会起作用。无论机器具有哪种字节顺序或字大小,C shift操作员都会做正确的事情。

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

答案 1 :(得分:1)

是的,看起来不错。几条评论:

  1. 当代码依赖于这一事实时,您应该使用uint8_t而不是假设unsigned char是8位。
  2. 使用局部变量进行接收会更加清晰(imo),因此您无需始终将指针切换到output
  3. 您可以只返回解码后的值,使decode()功能更清晰。
  4. -

     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;
     }